はじめに
SELECT を発行した時に、どの INDEX を利用するかは、一般的に DBMS のオプティマイザが自動で選択しますが、ヒント句を付加することで、明示的に利用する INDEX を指定することができます。
ヒント句の例
SQLServer
テーブル名 WITH(INDEX(インデックス名))
SELECT * FROM table_hoge WITH INDEX(index_hoge_01)
SQLServer でのヒント句の注意
指定した INDEX が定義されていないと SQL 発行時にエラーになります。
Oralce
SELECT /*+ INDEX(テーブル名 インデックス名) */
SELECT /*+ INDEX(table_hoge index_hoge_01) */ FROM table_hoge
Oracle でのヒント句の注意
テーブルをエイリアスにしている場合は、ヒント句もエイリアス名で指定する必要がある。
SELECT /*+ INDEX(t index_hoge_01) */ FROM hoge_table t
インデックス列に NOT NULL 制約がない場合は、理論上 NULL が引っかかる可能性があるとヒント句を指定しても無視される。
hoge_table.id な null 許可の場合
INDEXが有効
SELECT /*+ INDEX(t index_hoge_01) */ FROM hoge_table t
WHERE id = 'abc'
INDEXが有効
SELECT /*+ INDEX(t index_hoge_01) */ FROM hoge_table t
WHERE id IS NOT NULL
INDEXが有効
SELECT /*+ INDEX(t1 index_hoge_01) */ FROM hoge_table t1
inner join poge_table t2 on t1.id = t2.id
INDEXが無効
SELECT /*+ INDEX(t index_sample_table_01) */ FROM sample_table t
INDEXが無効
SELECT /*+ INDEX(t1 index_hoge_01) */ FROM hoge_table t1
left outer join poge_table t2 on t1.id = t2.id
おわりに
このレベルのメモ書きをアップする際の見やすいテンプレートみたいな形式はありますかね?