使用java的大型SQL数据集查询

时间:2011-10-05 14:54:54

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

我有以下配置:

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

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

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

感谢。

5 个答案:

答案 0 :(得分:1)

使用索引是用于解决此问题的标准技术。根据要求,以下是一些可以帮助您入门的指示:

答案 1 :(得分:1)

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

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

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

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

  • 你能减少列数吗?
  • 您可以一次返回更少的行吗?
  • 您是否可以在应用程序层中执行缓存?
  • 此查询是否为分区/物化视图的候选者(如果您的数据库支持这些视图)?

答案 2 :(得分:1)

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

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

  • 缺少正确的索引(如果有,则应将外键编入索引 加入以及where子句中的标准)
  • 强制查询不使用的where子句缺乏可攻义性 现有指数
  • 返回比所需更多的列
  • 相关的子查询和导致的标量函数 逐行激动行操作
  • 返回太多数据(任何人真的会看到100万 记录返回?您只想返回您在页面上显示的金额 不是整个可能的记录集)
  • 锁定和阻止

还有更多(毕竟很长的书都写在这个主题上)但这应该足以让你开始在哪里看。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

无论具体的数据库如何,我都会执行以下操作:

  1. 运行解释分析
  2. 确保您拥有属于where子句的列的索引
  3. 如果索引没问题,很可能你拿了很多 来自磁盘的记录,这是非常慢的:如果你真的无法改进 您的查询,以便您获取更少的记录,考虑集群你的 表,用于改善记录的磁盘位置。