2017-09-07 22 views
2

大規模なテーブル(1600万行)の列(日付)にクラスタ化されていない一意でないインデックスが作成されましたが、インデックスを使用しないでください。索引行の数が減少します。パフォーマンスが向上しない

クエリ1(インデックスを使用):

SELECT * 
FROM testtable 
WHERE date BETWEEN '01/01/2017' AND '03/01/2017' 
ORDER BY date 

クエリ2(NO指数):両方のクエリが実行され、同じ結果を返すために同じ時間がかかる

SELECT * 
FROM testtable WITH(INDEX(0)) 
WHERE date BETWEEN '01/01/2017' AND '03/01/2017' 
ORDER BY date 

。それぞれの実行計画を見ると、クエリ1の行数は
〜400万行で、クエリ2は1億600万行を読み込んでいます。インデックスは機能しているようですが、パフォーマンス上のメリットはありません。

これがなぜであるか、またはこの場合のクエリスピードを上げる方法については、何か考えてください。

+1

あなたが本当にすべての列が必要なのでしょうか?わずかしか持ってこないでもう一度試してみてください。インデックスに列を追加することができます。これは、カバーインデックスと呼ばれます。 – Horaciux

+0

'date'のデータ型は何ですか? – Lamak

+1

すべての列をインポートしているので、インデックスを排他的に使用しているわけではありません。つまり、NCインデックスはクエリをカバーしていないため、インデックスは使用されていますが、フィールド。 – Eli

答えて

0

が含まれる列にインデックスを作成します:Cover index

このトピックでは、SQL Server Management StudioまたはTransact-SQLを使用して、SQL Serverの非クラスタ化インデックスの機能を拡張する(または非キー)の列が含まれて追加する方法について説明します。非キー列を含めることにより、より多くのクエリをカバーする非クラスタ化インデックスを作成できます。これは、非キー列に以下の利点があるためです。

  • インデックスキー列として使用できないデータ型にすることができます。
  • インデックスキー列またはインデックスキーサイズの数を計算するときにデータベースエンジンで考慮されません。

非キー列のインデックスは、クエリのすべての列がキー列または非キー列のいずれかとしてインデックスに含まれていると、クエリのパフォーマンスを大幅に向上させる可能性があります。クエリオプティマイザはインデックス内のすべての列値を見つけることができるため、パフォーマンスが向上します。表またはクラスタード・インデックス・データへのアクセスは行われず、結果としてディスクI/O操作が少なくなります。

CREATE NONCLUSTERED INDEX IX_your_index_name 
ON testtable (date) 
INCLUDE (col1,col2,col3); 
GO 
+0

日付範囲を8カ月に拡大したとき、クエリ2はクエリ1よりも速く結果を返しました。これはあまり意味がありません。私はその後、Select文を日付カラムに限定しました.Query 2はやや速いです。何かご意見は? – Joey

関連する問題