0

非クラスター化インデックスの利点をテストします。

クエリを実行するときにdbAdventureWorksを使用します。

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の1つのアプローチは、投影された列を含めることです。

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

しかし、それは本当の問題を隠します。つまり、なぜそのような非選択的な述語のすべての行を選択することに興味があるのですか?アプリケーションはそのような要求を行うべきではありません。

于 2012-08-28T08:34:02.200 に答える