use*_*253 18 sql sql-server clustered-index
SQL 2000
NED表具有SIGN表的外键NED.RowID到SIGN.RowID
SIGN表具有NED表的外键SIGN.SignID到NED.SignID
RowID和SignID是作为GUID的聚簇主键(不是我的选择)
WHERE子句是:
FROM
[SIGN] A
INNER JOIN NED N ON A.SIGNID = N.SIGNID
INNER JOIN Wizard S ON A.WizardID = S.WizardID
INNER JOIN [Level] SL ON N.LevelID = SL.LevelID
LEFT JOIN Driver DSL ON SL.LevelID = DSL.LevelID
AND DSL.fsDeptID = @fsDeptID
INNER JOIN [Character] ET ON S.CharacterID = ET.CharacterID
INNER JOIN Town DS ON A.TownID = DS.TownID
WHERE
(A.DeptID = @DeptID OR
S.DeptID = @DeptID
AND
A.[EndTime] > @StartDateTime AND A.[StartTime] < @EndDateTime
AND
A.NEDStatusID = 2
Run Code Online (Sandbox Code Playgroud)
为什么SIGN表上有针对此查询的INDEX SCAN?什么会导致聚簇索引上的索引扫描?谢谢
zin*_*lon 22
聚簇索引扫描是SQL Server在具有聚簇索引的表上指定全表扫描的方式.这是因为您在SIGN表上没有足够的索引来满足WHERE子句,或者因为它确定SIGN表足够小(或者索引没有足够的选择性),因此表扫描会更有效.
只需检查查询,您可能必须索引DeptID列以及StartTime,EndTime和NEDStatusID的某些组合以避免表扫描.如果你问的原因是因为你遇到性能问题,你也可以运行索引调优向导(现在是SQL2005 +客户端工具中的数据库引擎调优顾问)并让它给出一些关于要创建速度的索引的建议你的查询.
这是一篇关于SQL Server何时达到"引爆点"并从索引查找切换到索引/表扫描的好文章:
http://www.sqlskills.com/BLOGS/KIMBERLY/post/The-Tipping-Point-Query-Answers.aspx
您可能希望查看查询的过滤方式,因为临界点通常比人们预期的要少得多.