create table SomeTable
(
id int identity(1, 1) not null
primary key clustered,
AnotherInt int null,
SomeData nvarchar(1024) null
)
go
insert into SomeTable(AnotherInt, SomeData)
values(null, null)
go 1000
update SomeTable
set
AnotherInt = id * 3 + 152,
SomeData = 'My ID value is ' + cast(id as nvarchar(16))
所以我们有一个带有聚集索引的测试表SomeTable 。执行以下查询:
select SomeData
from SomeTable
where AnotherInt < 200
在我们看到您的特定 DDL 和查询之前,有兴趣展示一个通用示例,请将以下内容作为基本示例:
所以我们有一个带有聚集索引的测试表SomeTable 。执行以下查询:
这会导致聚簇索引扫描,就像您看到的那样:
所以分析查询,我们有AnotherInt列在
WHERE
子句中并被搜索。我们还检索SomeData列,因此为了防止在聚集索引中进行键查找(或者优化器甚至可能再次使用聚集索引扫描),我们将SomeData作为INCLUDE
列:现在,执行上面相同的查询:
SQL Server 将利用该非聚集索引返回数据。它是一个覆盖索引,因为它不需要在聚集索引上查找剩余数据:
通过创建一个谨慎的 NCI,我们现在已经取消了 CI 扫描来代替索引搜索。