如何执行非聚簇索引查找而不是聚簇索引扫描

tes*_*der 0 t-sql database sql-server indexing

我测试了非聚簇索引的好处.

我使用db AdventureWorks当我执行查询时:

SELECT [address].City, [address].[AddressLine1] 
FROM [AdventureWorks].[Person].[Address] as [address]
WHERE [address].City = 'Seattle'
Run Code Online (Sandbox Code Playgroud)

我在执行计划选项卡中看到

/*
Missing Index Details from SQLQuery3.sql - 
The Query Processor estimates that implementing the following index could improve the query cost by 97.9636%.
*/

/*
USE [AdventureWorks]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [Person].[Address] ([City])

GO
*/
Run Code Online (Sandbox Code Playgroud)

我在执行简单选项卡图标"聚集索引扫描"中看到,我知道它是坏的,因为索引搜索更好

但是当我执行查询时

USE [AdventureWorks]
GO
CREATE NONCLUSTERED INDEX CityIdx
ON [Person].[Address] ([City])

GO
Run Code Online (Sandbox Code Playgroud)

我仍然看到执行中的普通标签"Clustered index scan".为什么不"聚集指数寻求"?它应该是"聚集索引寻求"吗?在哪些情况下它应该是"聚集索引寻求".

Rem*_*anu 5

您正在达到索引引爆点:只有太多条目City = 'Seattle'需要为每个条目寻找AddressLine1聚集索引.对于特定查询,一种方法是包括投影列:

CREATE NONCLUSTERED INDEX CityIdx
ON [Person].[Address] ([City])
INCLUDE ([AddressLine1]);
Run Code Online (Sandbox Code Playgroud)

但这隐藏了真正的问题,即为什么你有兴趣选择这种非选择性谓词的所有行?申请不应提出此类要求.