2013-03-27 8 views
6

最近、私はデータベースの微調整に入りました。私はSQL Serverに関するいくつかのアイデアを持ち、いくつかのインデックスを作成することに決めました。インデックスを作成するSQL Server 2008

このhttp://sqlserverplanet.com/ddl/create-indexを呼ばしかし、私は助けるどのように他のINCLUDEWITHオプションのようなインデックスの種類を理解していません。私はgoogleに試みたが、それらを使うときには簡単な説明を見落とした。

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) 

私は上記を使用する必要がありますか?彼らはパフォーマンスを向上させるでしょうか?

答えて

2

私はdatacompressionオプションを使用することはできませんが、Includeオプションはパフォーマンスを確実に向上させることができます。 PresidentNumberとPresident、YearsInOffice、またはRatingPoints列の1つ以上を選択し、ElectoralVotesがNULLでない場合、問合せは索引自体から値を取得し、基になる表に触れる必要はありません。テーブルに追加の列があり、その中の1つをクエリに含める場合は、テーブルとインデックスから値を取得する必要があります。


Select top 20 PresidentNumber, President, YearsInOffice, RatingPoints 
From Presidents 
where ElectoralVotes IS NOT NULL 

上記のクエリはIX_NC_PresidentNumberから読み取られ、

Select top 20 PresidentNumber, President, YearsInOffice, PoliticalParty 
From Presidents 
where ElectoralVotes IS NOT NULL 

このクエリが使用するクエリからすべての列がインデックスに含まれているため大統領のテーブルからデータを取得する必要はありません索引IX_NC_PresidentNumberおよびPresidents表も含まれます。これは、問合せのPoliticalParty列が索引に含まれていないためです。

Select PresidentNumber, President, YearsInOffice, RatingPoints 
From Presidents 
Where RatingPoints > 50 

このクエリは、最も可能性の高い指標で使用される句が一致していない、とそこに行数に制限はありませんどこ対クエリでwhere句ので、テーブルスキャンを行うことになります。

+0

ここでサンプルクエリを追加してください。それは簡単に考えて理解するのに役立ちます:) – Billa

+0

うまく見えます。だから我々は良いパフォーマンスを得るためにSELECT文のすべての列にIndexを追加する必要がありますか?テーブルスキャンを回避する。 – Billa

+0

いいえ、テーブルスキャンを避けるために、すべての列をインデックスに追加する必要はありません。表のスキャンを避けるために、where句で使用する列に索引を付ける必要があります。索引に行へのポインタが含まれているため、索引内のすべての列を持つことによるパフォーマンスの向上は比較的小さいです。大きな利得は、フィルタ列にインデックスを持つことです。 – BlackICE

4

圧縮後にクエリを実行すると、I/Oが削減されるためページ/エクステントが少なくなるため、I/Oを削減することは常に良い選択ですので、データの圧縮もクエリのパフォーマンスに役立ちます。

関連する問題