优化“IS NULL”

时间:2013-12-03 08:00:54

标签: optimization sql-server-2008-r2

由于where子句中的IS NULL检查,我的查询非常慢。至少,这就是它的样子。查询需要一分钟才能完成。

简化查询:

SELECT DISTINCT TOP 100 R.TermID2, NP.Title, NP.JID
FROM Titles NP
INNER JOIN Term P
    ON NP.TermID = P.ID
INNER JOIN Relation R
    ON P.ID = R.TermID2
WHERE R.TermID1 IS NULL -- the culprit?
    AND NP.JID = 3

我在所有提到的字段上都有非唯一的,非群集的和唯一的聚集索引,以及涵盖R.TermID1且具有过滤器TermID1 IS NULL的额外索引。

Term有2835302条记录。 Relation有25446678条记录,其中10%有TermID1 = NULL。

XML格式的SQL计划位于:http://pastebin.com/raw.php?i=xcDs0VD0

2 个答案:

答案 0 :(得分:0)

所以,我正在弄乱最大的表的索引,添加过滤的索引,覆盖列,围绕子句的变换等。

有一次,我只是删除了索引,并创建了一个具有旧配置的新索引,并且它有效!

答案 1 :(得分:-1)

您可以删除WHERE子句并将条件放入JOIN子句中。

SELECT DISTINCT TOP 100 R.TermID2, NP.Title, NP.JID
FROM Titles NP
INNER JOIN Term P
    ON NP.TermID = P.ID AND NP.JID = 3
INNER JOIN Relation R
    ON P.ID = R.TermID2 AND R.TermID1 IS NULL