where句の列の順序はインデックスの順序と同じにする必要がありますか?


8

私はこのuse-the-index-luke.comを読んでいて、インデックスのしくみを詳しく説明しています。インデックスの順序は非常に重要であり、クエリを高速化するにはwhere句の列がインデックス内の列と同じであることを、この担当者が繰り返し述べていることの1つ。今日、私はこの理論を裏付けるだけで、SQL Server 2008にテーブル(id int、name nvarchar(100))を作成しました。そこに5000行を挿入し、インデックスを作成しました create index abc on test (name, id )

そしてクエリを発射しました

select ID, name 
from test 
where ID = 10
and name = '10'

全テーブルスキャンの後にクエリプランの選択が続くことを期待していましたが、驚いたことに、プランの出力は選択に続くインデックススキャンでした。 クエリプラン

それで、私の質問は、Where句の列の順序が重要ですか、それともSQL Serverがインデックスの定義に従って列を再配置するのですか?

ありがとう!!


3
テストした実行プランは質問に答えませんか?
ypercubeᵀᴹ

はい !!しかし、私はいくつかの専門家の意見を望んでおり、これが失敗する場合があります。ありがとう!!
平等主義者

1
MySQLの同様の質問:MySQLでは、WHERE句の列の順序はクエリのパフォーマンスに影響しますか?SQL-Serverのオプティマイザは、MySQLのオプティマイザよりも数レベル高くなっています。
ypercubeᵀᴹ

回答:


13

だから、私の質問はWhere句の列の順序が重要かどうかです

いいえ。WHERE句の列の順序はまったく問題ではありません。


10

まずDROP、クエリウィンドウのステートメントが実行されなかったことは明らかですが、説明のために、あなたの質問に答えるようにします。


電話帳と同じようにインデックスを考えてください。エントリは姓でソートされ、次に名でソートされます。(これはインデックスキーの順序です。)

姓が「Davis」の人の電話番号をすべて検索するように頼んだら、適切なページに移動して番号を読み上げます。(これはインデックスシークです。)

「Janice」という名前の人のすべての電話番号を検索するように依頼すると、すべてのページを見て、それらすべてを見つける必要があります。(これは索引スキャンです。)

姓と名の両方を指定すると、最初の例と同様に、そのエントリをすばやく見つけることができます。姓を使用して正しいページを検索し、次に名を正確なエントリを見つけます。姓と名の両方を指定していれば、情報をどの順序で指定してもかまいません。

SQL Serverクエリオプティマイザーは同じ方法で動作します。インデックスキーの順序に基づいて、WHERE句内の条件の順序に関係なく、要求したデータを取得する最も効率的な方法が自動的に決定されます。


インデックススキャンとインデックスシークについての素晴らしい説明。
ニーラム

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.