Optimization “优化”;是空的;
我有一个查询非常慢,因为where子句中有一个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
为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
所以,我把最大表的索引弄得乱七八糟,添加过滤索引,覆盖列,修改子句等等
有一次,我简单地删除了索引,并创建了一个新的索引,它使用了旧的配置,并且工作正常 (尽管我只运行过一次查询)它比原始查询花费的时间要长得多。您可以比较这两个查询的计划,看看是否有任何索引需要优化。