0

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

我使用 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
*/

我在执行普通选项卡图标中看到“聚集索引扫描”,我知道这很糟糕,因为索引搜索更好

但是当我执行查询时

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

GO

我仍然看到执行中的普通选项卡“聚集索引扫描”。为什么不“聚集索引搜索”?它应该是“聚集索引搜索”吗?在这种情况下,它应该是“聚集索引搜索”。

4

1 回答 1

5

您正在达到索引的临界点:在聚集索引中,有太多的条目City = 'Seattle'需要麻烦地寻找每个条目。AddressLine1对于特定查询,一种方法是包含投影列:

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

但这隐藏了真正的问题,即您为什么对选择这种非选择性谓词的所有行感兴趣?应用程序不应提出此类请求。

于 2012-08-28T08:34:02.200 回答