小数据集的SQL查询持续时间更长?

3

我收到报告说我的报表生成应用程序无法正常工作。经过初步调查,我发现SQL事务超时了。我很困惑为什么查询更少的项目会花费更长时间返回结果。

快速查询(平均需要4秒返回):

SELECT * FROM Payroll WHERE LINEDATE >= '04-17-2010'AND LINEDATE <= '04-24-2010' ORDER BY 'EMPLYEE_NUM' ASC, 'OP_CODE' ASC, 'LINEDATE' ASC

长查询(平均需要1分20秒返回结果):

SELECT * FROM Payroll WHERE LINEDATE >= '04-18-2010'AND LINEDATE <= '04-24-2010' ORDER BY 'EMPLYEE_NUM' ASC, 'OP_CODE' ASC, 'LINEDATE' ASC

我可以简单地增加SqlCommand的超时时间,但这并不改变查询所花费的时间比预期更长的事实。

为什么请求子集的项目要比返回更多数据的查询时间更长?我如何优化此查询?


这是从 MSSQL Sharepoint 数据库中提取的。Payroll 表实际上是一个“视图”,它从 Sharepoint 列表和 Project Web Access 中提取字段,以生成某些工作的计费小时数。 - Greg Buehler
2个回答

2

很可能是因为更长的范围使优化器选择了全表扫描并进行排序,而不是索引扫描,结果证明前者更快。

索引遍历可能比表扫描花费更长的时间,原因有很多。

例如,可能表本身完全适合缓存,但同时缓存不下表和索引。


差不多了。稍微阅读一下如何调查这个问题。执行计划显示有两个额外的分支在搜索哈希匹配和聚集索引扫描。 - Greg Buehler

0
除了在LINEDATE列上没有索引之外。 这取决于您使用的数据库服务器,一些维护统计信息以影响查询计划以优化访问。
例如,对于Informix,您可以执行UPDATE STATISTICS语句。 并且可以使用SET EXPLAIN ON在查询计划中检查成本。
您应该检查文档以获取类似的语句。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接