【发布时间】:2009-03-12 14:41:04
【问题描述】:
在this blog post,我需要澄清一下为什么 SQL Server 会选择特定类型的扫描:
为了简单起见,我们假设 col1 是独一无二的,并且永远存在 值增加,col2 有 1000 不同的价值观,有 表中有 10,000,000 行,并且 聚集索引由 col1 组成, 并且非聚集索引存在于 col2.
想象一下查询执行计划 最初为以下创建 传递参数:@P1=1 @P2=99
这些值会导致 以下的最佳查询计划 使用替换的语句 参数:
Select * from t where col1 > 1 or col2
99 按 col1 排序;
现在,想象一下查询执行计划 如果初始参数值为: @P1 = 6,000,000 和 @P2 = 550。
和以前一样,最佳查询计划将 替换后创建 传递参数:
Select * from t where col1 > 6000000 或 col2 > 550 按 col1 排序;
这两个相同的参数化 SQL 语句可能会创建 和缓存非常不同的执行 由于计划的不同 最初传递的参数值。 但是,由于 SQL Server 只缓存 每个查询一个执行计划,机会 在第一种情况下非常高 查询执行计划将利用 聚集索引扫描,因为 ‘col1 > 1’ 参数替换。 而在第二种情况下,查询 使用索引查找的执行计划将 最有可能被创建。
为什么第一个查询使用聚集索引,而第二个查询使用索引查找?
【问题讨论】:
-
如果您从命令式更改标题,您可能会得到更多响应...
标签: sql-server indexing