SQLチューニング手順まとめ

参考記事:
HJ/NLの切替件数確認
フルスキャンとインデックスアクセス
HJ結合順へのデータ件数影響
HJでのインデックスフルスキャンとテーブルフルスキャンの比較
結合条件の推移律
外部結合による結合順の制約(HJ)
外部結合による結合順の制約(NL)
パーティションワイズジョイン


[1] 結合タイプがNL型かHJ型かの判定

そのSQLが扱う処理件数を確認する。
1~10万件以下の場合はNested loop、それ以上の場合はHash Joinとする
Merge Joinは検討不要

複雑なSQLの場合は、この2つの型が混在する場合もある


[2] 結合タイプがNL型の場合

[2.1]アクセスパスについて
最初にアクセスするテーブルはインデックスアクセス、
残りのテーブルは主キー/外部キーによるアクセスが前提


[2.2]結合順について

SQLで参照されているテーブルそれぞれについて
where条件適用後の件数を求め、最も件数が少なくなるテーブルを最初にアクセスするテーブル(駆動表)とする。

残りのテーブルは結合条件的に可能な範囲で、結合後の件数が最も少なくなるテーブルを順番に選んで結合していく。

この際下記点に注意する
Oracleは結合条件の推移律に対応していない
・NLの場合、外部結合で結合順に制約がある


[3] 結合タイプがHJ型の場合

[3.1]アクセスパスについて
基本的にテーブルフルスキャン。ただし、
参照しているカラムがインデックス参照のみで済む場合は、
インデックスフルスキャンを検討する。

Oracleで、あまりカラム数に差がない場合は、テーブルフルスキャンを選ぶ


[3.2]結合順について

SQLで参照されているテーブルそれぞれについて
where条件適用後の件数を求め、最も件数が少なくなるテーブルを最初にアクセスするテーブル(駆動表)とする。

残りのテーブルは結合条件的に可能な範囲で、結合後の件数が最も少なくなるテーブルを順番に選んで結合していく。

この際下記点に注意する
Oracleは結合条件の推移律に対応していない
・HJの場合、できるだけ、件数が少ないテーブルをビルド表とする
・HJの場合、外部結合で結合順に制約はない(MySQLは除く)
Oracleでフルパーティションワイズジョインが動作する場合は、優先するように考慮する