我正在使用Microsoft SQL Server企业版(64位)。为什么我的查询执行得这么慢?这需要10分钟。
以下是执行计划的一些屏幕截图,这些计划最耗费成本
SELECT
1_code
,count(DISTINCT 2_code) AS viso
FROM
docum(NOLOCK)
INNER JOIN
for_vers(NOLOCK) ON doc = fv
INNER JOIN
for(NOLOCK) ON fv = f
INNER JOIN
persons(NOLOCK) ON doc = p
INNER JOIN
tax ti(NOLOCK) ON p = ti
INNER JOIN
person(NOLOCK) ON pm = p
WHERE
pm_ = 14
AND (pm_date IS NULL OR pm_date > getdate())
AND (pm_till IS NULL OR pm_till > getdate())
AND start_date >= '2015-01-01'
AND end_date <= '2015-12-31'
AND code = 1
AND code IN (25)
AND dprt_code IN (20, 21, 22, 23, 24, 25, 30)
GROUP BY
code
答案 0 :(得分:2)
考虑更新statistics
。您的执行计划显示实际行数(当您声明 52,082,116 行)与执行计划显示的估计行数之间存在很大差异。要了解有关统计信息的更多信息,请参阅此link。引用:
查询优化器使用统计信息来创建改进的查询计划 查询性能。
您可以按documentation中的说明调用update statistics
查询,但请记住您运行此命令的时间和位置(这会影响性能)。小心并阅读文档。考虑Maintenance Plan中的Update Statistics Task
。还有一个很好的article,它解释了有关统计数据和性能的更多信息。
正如其他人在评论中指出的那样,考虑某种Denormalization并仔细检查isolation level是否真的没问题(您的nolock
)。
检查这些hints以了解执行计划。
答案 1 :(得分:1)
如果可能,请尝试减少这些内连接。如果不可能,那么尝试在脚本的末尾进行内连接。它节省了大量时间。
要删除群集密钥查找,您应使用覆盖索引。如果您正确创建覆盖索引,则不会有 群集密钥查找 。