我在SQL Server 2005中有一个存储过程,当我运行它并查看它的执行计划时,我注意到它正在进行聚簇索引扫描,这要花费84%。我已经读过,我必须修改一些东西以获得Clustered Index Seek,但我不知道要修改什么。
我会感激任何帮助。
谢谢,
布赖恩
答案 0 :(得分:20)
SELECT * FROM <table>
。这是一个简单的案例,可以通过一个简单的索引扫描完全覆盖,而无需考虑任何其他内容。WHERE column = @value
但列为VARCHAR
(Ascii),@ value为NVARCHAR
(Unicode)。(foo, bar)
上,但WHERE子句仅在bar
上。 这些是一些快速指针,指出在预期聚簇索引搜索时可能存在聚簇索引扫描的原因。这个问题非常通用,除了依靠8球之外,不可能回答'为什么'。现在,如果我将您的问题正确记录并正确表达,那么期望聚集索引搜索,这意味着您正在根据已确定的键值搜索唯一记录。在这种情况下,问题必须与WHERE子句的SARGability有关。
答案 1 :(得分:6)
如果Query在表中包含超过一定百分比的行,则优化器将选择执行扫描而不是搜索,因为它预测在这种情况下它将需要更少的磁盘IO(对于Seek,它返回的每一行在索引中每个级别需要一个磁盘IO,而对于扫描,整个表中每行只有一个磁盘IO。
因此,如果在b-tree索引中有5个级别,那么如果查询将生成表中超过20%的行,则读取整个表比使用每个的5个IO更便宜20%的行...
您可以稍微缩小查询的输出,以减少此过程中此步骤返回的行数吗?这将有助于它选择扫描的搜索。