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

时间:2012-08-28 08:22:41

标签: sql-server database tsql indexing

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

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

SELECT [address].City, [address].[AddressLine1] 
FROM [AdventureWorks].[Person].[Address] as [address]
WHERE [address].City = 'Seattle'

我在执行计划标签中看到

/*
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
*/

我在执行普通标签图标“Clustered index scan”中看到,我知道它很糟糕,因为索引搜索更好

但是当我执行查询

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

GO

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

1 个答案:

答案 0 :(得分:5)

您正在点击index tipping pointCity = 'Seattle'的条目太多,无法为每个条目寻找聚集索引中的AddressLine1特定查询的一种方法是包含预计列:

CREATE NONCLUSTERED INDEX CityIdx
ON [Person].[Address] ([City])
INCLUDE ([AddressLine1]);

但这隐藏了真正的问题,即为什么您是否有兴趣在这样的非选择性谓词上选择所有行?申请人不应提出此类要求。