4

これを何度も見てきましたが、SQL Serverデータベースエンジンチューニングアドバイザーで分析を実行すると、次のようなインデックスを作成するように提案されます。

CREATE NONCLUSTERED INDEX [_index] ON [dbo].[SomeTable] 
(
    [Column1] ASC,
    [Column2] ASC,
    [Column3] ASC
)
INCLUDE ([PrimaryKeyColumn])

含まれる列のリストに主キー(クラスター化インデックス)列を含めることは本当に重要ですか?元の行へのリンクとしてデフォルトで含まれているといつも思います。私が間違っている?

更新: SELECT [PrimaryKeyColumn]FROM[dbo]。[SomeTable]WHERE... [Conditions] ...のようなクエリのインデックスを提案していることに注意することも重要だと思います。これは、パフォーマンスと実行プランに大きく影響します。私が理解している限り、インデックスには実際には「クラスター化インデックス」は含まれていませんが、行へのリンクが含まれているだけです。そうですか?

4

2 に答える 2

6

INCLUDE の有無にかかわらず、インデックスを作成できます。PrimaryKeyCol がクラスター化インデックスの場合、 SQL Server はそれを無視します。つまり、クラスター化されたインデックス値を 2 回保存することはありません。

完全を期すために、クラスター化インデックスを変更した場合に備えて、おそらくそうするでしょう

編集:

SQL Server がこれをインテリジェントに処理するサイズを観察しましたこれは、 Kalen Delaney の非クラスター化インデックス キーの詳細
ほど科学的ではありません

DROP TABLE IncludeTest;
GO
CREATE TABLE IncludeTest (
    BadClusteredKey uniqueidentifier DEFAULT NEWID() PRIMARY KEY,
    OtherCol AS CHECKSUM(BadClusteredKey) % 10000,
    Filler char(200) NOT NULL DEFAULT 'a and lots of spaces'
    );
GO

INSERT IncludeTest (Filler) VALUES (DEFAULT);
GO
INSERT IncludeTest (Filler) SELECT Filler FROM IncludeTest
GO 20
SELECT COUNT(*) FROM IncludeTest;

EXEC sp_spaceused 'IncludeTest', 'true'
GO -- 400680 KB, 1920 KB

CREATE INDEX IX_OtherCol1 ON IncludeTest (OtherCol);
GO
EXEC sp_spaceused 'IncludeTest', 'true'
GO -- 400680 KB, 29024 KB KB

DROP INDEX IncludeTest.IX_OtherCol1
GO
EXEC sp_spaceused 'IncludeTest', 'true'
GO -- 400680 KB, 1920 KB

CREATE INDEX IX_OtherCol2 ON IncludeTest (OtherCol) INCLUDE (BadClusteredKey);
EXEC sp_spaceused 'IncludeTest', 'true'
GO -- 400680 KB, 29024 KB

DROP INDEX IncludeTest.IX_OtherCol2
GO
EXEC sp_spaceused 'IncludeTest', 'true'
GO -- 400680 KB, 1920 KB
于 2012-02-15T10:08:56.253 に答える
0

チューニング アドバイザーがクエリを検出し、選択した原因に PrimaryKeyColumn があり、原因の場所に Column1、Column2、および Column3 があることを発見したと思います。

チューニング・アドバイザーは次のように考えています.... 索引に PrimaryKeyColumn を含めれば、SQL はデータ・ページ (テーブル・データ・ページ) で PrimaryKeyColumn データを取得するためにルックアップするためのオーバーヘッドを浪費する必要はありません。SQLエンジンは、クエリのためにインデックスからPrimaryKeyColumn値を直接取得できます。それは時間を節約します..

注意: インデックスには悪い面があります (インクルード列)。http://msdn.microsoft.com/en-us/library/ms190806.aspxには、意思決定に役立つ有用な情報が含まれています。

于 2012-02-15T09:12:25.627 に答える