実践「結合方法編」
インデックス編と同じく「アクセスブロック数の低減」を目指そう。
まず最初にどの結合方法が適しているのかを考えよう。
1.ネステッド・ループ結合
抽出レコード数が少なく、インデックスが有効に機能する場合に効果的なことが多い。
(1)外部テーブルはレコード数が少ない方にする
◆「テーブルのレコード数で比較ではなく、抽出条件加味後で判断」
◆「外部テーブルのレコード数の方が多くても速い場合もある」
結合時のレコード数で判断しよう。
内部テーブルにPKで結合できる場合など、レコード数多寡が逆転していても有利な場合がある。
(2)内部テーブルはインデックスで結合したい
◆「結合列にNULLがあるとインデックスが使用されないよ」
フルテーブルスキャンにしないためにはあらかじめNOT NULL制約を付けておくか、IS NOT NULL条件でNULLを排除しておく。
※オプティマイザがインデックスを使用するために自動でIS NOT NULL条件でフィルタすることもある。
2.ソート/マージ結合
抽出レコード数が多く、ハッシュ結合が有効でない場合に効果的。
(1)結合列にはインデックス推奨
◆「インデックスを使うとソート処理が省略できる」
結合の都合上、ソート処理が必要だが、インデックスは既にソート済みなのでソート処理が不要。
3.ハッシュ結合
内部テーブルはフルテーブルスキャンになるので、
- インデックスでなくても結合処理に差がない。
- カーディナリティーが高くても効果的。
(1)ヒント句によるハッシュ結合指定は注意
◆「ハッシュメモリ領域に収まらないデータ量の場合、パフォーマンスが劣化する。」