群集密钥查找成本高

时间:2016-02-23 13:55:31

标签: sql sql-server performance

我正在使用Microsoft SQL Server企业版(64位)。为什么我的查询执行得这么慢?这需要10分钟。

以下是执行计划的一些屏幕截图,这些计划最耗费成本

enter image description here

enter image description here

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

2 个答案:

答案 0 :(得分:2)

考虑更新statistics。您的执行计划显示实际行数(当您声明 52,082,116 行)与执行计划显示的估计行数之间存在很大差异。要了解有关统计信息的更多信息,请参阅此link。引用:

  

查询优化器使用统计信息来创建改进的查询计划   查询性能。

您可以按documentation中的说明调用update statistics查询,但请记住您运行此命令的时间和位置(这会影响性能)。小心并阅读文档。考虑Maintenance Plan中的Update Statistics Task。还有一个很好的article,它解释了有关统计数据和性能的更多信息。

正如其他人在评论中指出的那样,考虑某种Denormalization并仔细检查isolation level是否真的没问题(您的nolock)。

检查这些hints以了解执行计划。

答案 1 :(得分:1)

如果可能,请尝试减少这些内连接。如果不可能,那么尝试在脚本的末尾进行内连接。它节省了大量时间。

要删除群集密钥查找,您应使用覆盖索引。如果您正确创建覆盖索引,则不会有 群集密钥查找