最近、私はデータベースの微調整に取り掛かりました。 SQL Serverについていくつかのアイデアがあり、インデックスを作成することにしました。
これを参照 http://sqlserverplanet.com/ddl/create-index
しかし、INCLUDE
、WITH
オプションのような他のタイプのインデックスがどのように役立つかわかりません。私はグーグルを試してみましたが、それらを使用するときに簡単な説明が表示されませんでした。
CREATE NONCLUSTERED INDEX IX_NC_PresidentNumber
ON dbo.Presidents (PresidentNumber)
INCLUDE (President,YearsInOffice,RatingPoints)
WHERE ElectoralVotes IS NOT NULL
CREATE NONCLUSTERED INDEX IX_NC_PresidentNumber
ON dbo.Presidents (PresidentNumber)
WITH ( DATA_COMPRESSION = ROW )
CREATE NONCLUSTERED INDEX IX_NC_PresidentNumber
ON dbo.Presidents (PresidentNumber)
WITH ( DATA_COMPRESSION = PAGE )
上記を使用する必要があるシナリオは何ですか?それらはパフォーマンスを向上させますか?
データ圧縮はクエリのパフォーマンスにも役立ちます。圧縮後、クエリを実行すると、読み込まれるページ/エクステントが少なくなります。I/ Oが削減されるため、I/Oを削減することは常に良い選択です。
With datacompressionオプションと話すことはできませんが、Includeオプションを使用するとパフォーマンスが確実に向上します。 PresidentNumber列と1つ以上のPresident、YearsInOffice、またはRatingPoints列のみを選択し、ElectoralVotesがnullでない場合、クエリはインデックス自体から値を取得し、基になるテーブルに触れる必要はありません。テーブルに追加の列があり、それらの1つをクエリに含めると、テーブルとインデックスから値を取得する必要があります。
Select top 20 PresidentNumber, President, YearsInOffice, RatingPoints
From Presidents
where ElectoralVotes IS NOT NULL
上記のクエリはIX_NC_PresidentNumberからのみ読み取られ、クエリのすべての列がインデックスに含まれているため、Presidentsテーブルからデータをプルする必要はありません。
Select top 20 PresidentNumber, President, YearsInOffice, PoliticalParty
From Presidents
where ElectoralVotes IS NOT NULL
クエリのPoliticalParty列はインデックスに含まれていないため、このクエリではインデックスIX_NC_PresidentNumberとPresidentsテーブルも使用されます。
Select PresidentNumber, President, YearsInOffice, RatingPoints
From Presidents
Where RatingPoints > 50
クエリのwhere句とインデックスで使用されるwhere句が一致せず、行数に制限がないため、このクエリはテーブルスキャンを実行する可能性があります。