Optimization “优化”;是空的;

Optimization “优化”;是空的;,optimization,sql-server-2008-r2,Optimization,Sql Server 2008 R2,我有一个查询非常慢,因为where子句中有一个为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 c

我有一个查询非常慢,因为where子句中有一个
为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为NULL

该学期有2835302项记录。关系有25446678条记录,其中10%的记录的TermID1=NULL


XML格式的SQL计划如下:

您可以删除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

所以,我把最大表的索引弄得乱七八糟,添加过滤索引,覆盖列,修改子句等等


有一次,我简单地删除了索引,并创建了一个新的索引,它使用了旧的配置,并且工作正常

(尽管我只运行过一次查询)它比原始查询花费的时间要长得多。您可以比较这两个查询的计划,看看是否有任何索引需要优化。