使用SQL Server 2008作为应用程序数据库的tomcat应用程序性能缓慢



我构建了一个java web应用程序,如果查询的表中的大小约为100条记录,它可以与SQL Server 2008配合使用。但当我将其增加到130万条记录时,执行一个查询大约需要4-8分钟。我的应用程序使用hibernate。

我已经在一个6gb的ram服务器和一个12gb的ram服务器上部署了这个应用程序,并将我的java堆大小分别增加到4gb和8gb,但我仍然遇到同样的问题。

请问我能做些什么来提高绩效?

更新:

这是一个sql查询,在sql Server上运行速度非常慢,但在Postgresql 上运行速度很快

select distinct c.company from Affiliates c where c.portalUser.userId = 'user.getUserId()' and lower(c.company.classification.name) = lower('" + companyClass + "') order by c.company.dateOfReservation desc";

我认为您的示例查询中最痛苦的部分是

lower(c.company.classification.name) = lower('" + companyClass + "')

在这里,您强制进行表扫描,因为每一行的名称都必须小写并进行比较。如果您的数据库没有配置为比较大小写,则可以省略lower()调用。如果没有,您可以考虑添加一个带有字符串小写副本的额外列,并将此副本用于查询。

有多少个companyClasses?你能用所有的公司类创建一个单独的表并通过索引引用它吗?这可能会大大加快此查询的速度,因为您不再需要进行任何varchar比较。

只是一些想法。

您没有提供任何代码或足够的具体细节,但通常的原因是:

  1. 发出数百万个ORM查询。使用SQL事件探查器(或打开Hibernate的日志记录)来确定您是否正在从代码中发出多个选择,而使用单个存储过程来完成所有工作会更合适。这个SO答案向您展示了如何启用Hibernate SQL日志记录。

  2. 索引不足的表导致大量的大型表扫描。请参阅如何登录并查找最昂贵的查询?。确定昂贵的查询并创建索引以提高其性能。

注意:@Adriaan Koster指出了在查询中执行的小写转换。默认情况下,SQL Server不区分大小写(我只遇到过一个20年前没有的,而且设置错误),所以几乎可以肯定地将转换为小写。这将允许查询使用适当的索引(如果存在的话)。

最新更新