【问题标题】:Slow tomcat application performance using SQL Server 2008 as the app database使用 SQL Server 2008 作为应用程序数据库的 Tomcat 应用程序性能缓慢
【发布时间】:2013-12-30 20:06:18
【问题描述】:

我构建了一个 java web 应用程序,如果查询表中的大小约为 100 条记录,它可以在 SQL Server 2008 上正常工作。但是当我将它增加到 130 万条记录时,执行单个查询大约需要 4-8 分钟。我的应用程序使用休眠。

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

请问我可以做些什么来提高性能?

更新:

这是一种在 SQL Server 上运行速度很慢但在 Postgresql 上运行速度很快的 sql 查询

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";

【问题讨论】:

  • 米奇小麦有恕我直言的权利。扩展他的建议,我建议你从hybernate获取一个查询日志,你就会明白一切。
  • 您是否在查询的列上放置了索引?
  • @AdriaanKoster 我在列上放了索引,但我仍然遇到同样的问题

标签: java sql-server sql-server-2008 hibernate tomcat


【解决方案1】:

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

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

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

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

只是一些想法。

【讨论】:

    【解决方案2】:

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

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

    2. 索引不良的表会导致大量大型表扫描。请参阅如何Can I Log and Find the Most Expensive Queries?。确定昂贵的查询并创建索引以提高其性能。

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

    【讨论】:

    • 谢谢@mitch。我已经尝试过 SQL Profiler,但从代码中发出了许多选择。但我仍会使用如何记录和查找最昂贵的查询中的文章进行测试?
    • 另外我将数据推送到 postgresql 并且应用程序工作正常但客户端坚持使用 SQL Server
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多