インデックスの「左端のプレフィックスルール」はSQLServerに適用されますか?
MySQLでは、左端のプレフィックスは、で説明されている複数列のインデックスの場合に適用されます。
- https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html
- https://dev.mysql.com/doc/refman/8.0/en/multiple-column-indexes.html
インデックスが(col1、col2、col3)で構成されているとします。インデックス検索の対象となる組み合わせ:
- (col1)
- (col1、col2)
- (col1、col2、col3)
インデックス検索に適格でない組み合わせ:
- (col2)
- (col2、col3)
- (col3)
SQL Serverは、インデックスシークメカニズムにも同じルールを使用しますか?参照できる公式文書はありますか?探してみましたが運が悪かったです:(よろしくお願いします!
回答
SQL Serverも、複合インデックスに対して同様のアプローチに従います。この場合、左からの列のみがインデックスシークの対象と見なされます。以下は同じものの公式ドキュメントです:
(a、b、c)のインデックスは、以下のシーククエリに役立ちます
- a
- a、b
- a、b、c
MSDNでインデックスデザインの実践についてもっと読む
インデックスに複数の列が含まれる場合は、列の順序を考慮してください。WHERE句で等しい(=)、より大きい(>)、より小さい(<)、またはBETWEEN検索条件で使用される列、または結合に参加する列を最初に配置する必要があります。追加の列は、区別のレベルに基づいて、つまり、最も明確なものから最も明確でないものへと並べ替える必要があります。
たとえば、インデックスがLastName、FirstNameとして定義されている場合、検索条件がWHERE LastName = 'Smith'またはWHERELastName = Smith AND FirstName LIKE'J% 'の場合、インデックスは役立ちます。ただし、クエリオプティマイザは、FirstNameのみを検索するクエリのインデックスを使用しません(WHERE FirstName = 'Jane')
そのルールは基本的にbツリーインデックスをスキャンするためのルールです。
とはいえ、Oracleが「スキップスキャン」と呼ぶ代替スキャン方法があります。これにより、インデックスの左端にないキーでインデックスをスキャンできます。一部のデータベースは、多かれ少なかれこれを実装しています。これがこのトピックの良い紹介です。SQLServerがスキップスキャンを実装しているとは思いません。
スキップスキャンは強力ですが、その有用性はインデックスの最初のキーのカーディナリティに依存します。最初のキーのカーディナリティが高い場合、それらはあまり効果的ではありません。