1. ホーム
  2. sql

[解決済み】インデックスのカラムの順番はどのくらい重要ですか?

2022-04-13 23:44:25

質問

インデックス宣言の先頭に、最も選択されるカラムを置くと良いと聞いたのですが、どうでしょうか? 例

CREATE NONCLUSTERED INDEX MyINDX on Table1
(
   MostSelective,
   SecondMost,
   Least
)

まず、私の言っていることは正しいのでしょうか? もしそうなら、インデックスのカラムの順番を並べ替えることでパフォーマンスに大きな違いが出る可能性がありますか?それとも、「やってよかった」と思えるようなことですか?

DTAでクエリを実行したところ、既存のインデックスとほぼ同じカラムを持つ、順番が異なるだけのインデックスを作成するよう勧められたため、質問させていただきました。 私は、既存のインデックスに不足しているカラムを追加して、それを良いことにすることを検討していました。 どうでしょうか?

どのように解決するのですか?

このようなインデックスを見てください。

Cols
  1   2   3
-------------
|   | 1 |   |
| A |---|   |
|   | 2 |   |
|---|---|   |
|   |   |   |
|   | 1 | 9 |
| B |   |   |
|   |---|   |
|   | 2 |   |
|   |---|   |
|   | 3 |   |
|---|---|   |

Aを最初の列として制限することで、2番目の列を最初に制限するよりも多くの結果が排除されることがわかりますか? 1列目、2列目...とインデックスを横断していく様子を思い浮かべるとわかりやすいでしょう。1回目のパスで結果の大部分を取り除くことで、2回目のステップをより速くできることがわかります。

もうひとつ、カラム3についてクエリを実行した場合、オプティマイザはインデックスを使用しません。なぜなら、結果セットを絞り込むのに全く役に立たないからです。 クエリではいつでも、次のステップに進む前に処理する結果の数を絞り込むことが、パフォーマンスの向上につながるのです。

インデックスもこの方法で保存されるので、クエリーを実行する際に、最初のカラムを見つけるためにインデックスを遡る必要がありません。

要するに、見せかけではなく、実際にパフォーマンス上の利点があるのです。