我测试了非聚簇索引的好处。
我使用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”。为什么不“聚集指数寻求”?它应该是“聚集索引寻求”吗?在哪些情况下应该是“聚集索引寻求”。
答案 0 :(得分:5)
您正在点击index tipping point:City = 'Seattle'
的条目太多,无法为每个条目寻找聚集索引中的AddressLine1
。 此特定查询的一种方法是包含预计列:
CREATE NONCLUSTERED INDEX CityIdx
ON [Person].[Address] ([City])
INCLUDE ([AddressLine1]);
但这隐藏了真正的问题,即为什么您是否有兴趣在这样的非选择性谓词上选择所有行?申请人不应提出此类要求。