【问题标题】:Large SQL dataset query using java使用 java 的大型 SQL 数据集查询
【发布时间】:2011-10-05 14:54:53
【问题描述】:

我有以下配置:

  • SQL Server 2008
  • Java 作为后端技术 - Spring + Hibernate

基本上我想要做的是在表上使用 where 子句进行选择。问题是该表有大约 700M 条目,查询需要很长时间。

您能否指出一些关于在何处优化查询的指示,或者我可以使用哪些技术来提高性能?

谢谢。

【问题讨论】:

  • 根据您的访问(查询)模式创建数据库索引,通常这就是您所需要的。或者您的查询是否一次性读取了所有 700m 的数据?
  • where 子句是选择了少量的行,还是结果集也很大?表上有合适的索引吗?

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


【解决方案1】:

使用索引是用于处理此问题的标准技术。根据要求,这里有一些建议可以帮助您入门:

【讨论】:

    【解决方案2】:

    在这种情况下,我要做的第一件事是隔离我返回的数据量是否是问题(I/O 问题)。一种简单的非科学方法是将查询更改为仅返回计数:

    select count(*) --just return a count, no data!
    from MyTable
    inner join MyOtherTable on ...
    where ...
    

    如果它运行得非常快,它会告诉您您的索引是有序的(假设您的 WHERE 子句中没有子选择)。如果没有,那么您需要work on indexes、WHERE 子句或您的查询构造本身(正在完成连接等)。

    一旦满意,请重新添加您的SELECT 子句。如果速度很慢,您将不得不查看您的数据访问模式:

    • 你能返回更少的列吗?
    • 您可以一次返回更少的行吗?
    • 是否可以在应用层进行缓存?
    • 此查询是否适合分区/物化视图(如果您的数据库支持这些)?

    【讨论】:

      【解决方案3】:

      我会运行 Profiler 来查找正在生成的确切查询。 ORM 可以创建不太理想的查询。知道查询后,您可以在 SSMS 中运行它并查看执行计划。这将为您提供有关性能问题的线索。

      可能导致性能问题的几件事:

      • 缺乏正确的索引(如果你有外键应该被索引) 连接以及 where 子句中的条件)
      • where 子句中缺乏可搜索性,强制查询不使用 现有索引
      • 返回的列比需要的多
      • 相关的子查询和标量函数导致 逐行操作
      • 返回太多数据(有人真的会看 100 万 记录返回?您只想退回您在页面上显示的金额 不是整个可能的记录集)
      • 锁定和阻止

      还有更多(毕竟所有很长的书都是关于这个主题的),但这应该足以让你开始看哪里。

      【讨论】:

      • 如果没有足够的工具和知识,查询调优会变得复杂而令人生畏。很好的答案;我要注意的另一件事是 Hibernate 想要为您生成查询。如果查询需要针对性能进行调整,您需要告诉 Hibernate 使用您的特定查询。
      【解决方案4】:

      您应该为那些经常用来限制结果的列提供一些索引。另一件事是结果集的分页。

      【讨论】:

        【解决方案5】:

        不管具体的数据库,我都会做以下事情:

        1. 运行解释分析
        2. 确保您的 where 子句中的列有一个索引
        3. 如果索引正常,很可能您正在获取大量 从磁盘记录,这很慢:如果你真的不能细化 您的查询,以便您获取更少的记录,请考虑将您的 表,以改善记录的磁盘局部性。

        【讨论】:

          猜你喜欢
          • 2015-01-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-15
          • 1970-01-01
          • 2014-08-15
          相关资源
          最近更新 更多