聚集索引扫描(Clustered)与索引查找(NonClustered)+键查找(Clustered)

Dio*_*ogo 7 sql-server execution-plan explain

我有以下表格和内容

create table t(i int primary key, j int, k char(6000))
create  index ix on t(j)

insert into t values(1,1,1)
insert into t values(2,1,1)
insert into t values(3,1,1) 
insert into t values(4,1,1)
insert into t values(5,1,1)
insert into t values(6,1,1)
insert into t values(7,1,1)
insert into t values(8,2,2) 
insert into t values(9,2,2)

select * from t where j = 1
select * from t where j = 2
Run Code Online (Sandbox Code Playgroud)

我真的很困惑为什么第一个 SELECT 只使用Clustered Index Scan (Clustered)而第二个使用Index Seek (NonClustered)Key Lookup (Clustered)

执行计划

有人可以帮我解决这个问题吗?

Cha*_*tox 12

因为表的大部分符合第一次查询的条件,所以扫描聚集索引比对符合条件的每一行进行键查找更有效。

键查找很昂贵,因此通常仅在表的一小部分符合 WHERE 标准时才使用。一旦查询返回表的某个百分比(又名临界点),优化器就会回退到聚集索引扫描,因为这是更有效的计划。

参见 Kimberly Tripp 关于引爆点的博客文章