忍者ブログ
IT関係の小作人労働の日々の日記です。 最近データベースが好きです。 インフラ構築、DB構築、アプリケーション開発・・・何でも屋です。 何でもできそうで、何にもできない。

【データベースの知識】結合(JOIN)アルゴリズムの選択と最適化


データベースを扱う上で避けて通れないのが「テーブル結合(JOIN)」です。SQLを書けば結果は同じに見えますが、内部のアルゴリズム選択ひとつで、処理速度は100倍、1000倍と劇的に変わります。今回は実務で役立つ3つの主要アルゴリズムを解説します。

1. 主要な3つの結合アルゴリズム

【 基本 】 データベースが2つのテーブルを繋ぐ際、主に以下の3つの手法から最適なものを選択します。それぞれ「得意なデータ量」と「リソースの使い方」に明確な違いがあります。

Nested Loop Join(入れ子ループ法)
外側の表から1行ずつ取り出し、内側の表を走査して一致を探します。少量のデータに強く、インデックスの活用が前提となります。
Sort Merge Join(ソートマージ法)
両方の表を結合キーでソートし、端から順に突き合わせます。大量データに強く、不等号結合(<, >)でも利用可能です。
Hash Join(ハッシュ結合)
片方の表からメモリ上にハッシュテーブルを作り、もう片方と突き合わせます。大量データ同士の等価結合(=)において非常に強力です。

2. 特徴比較表:データ量とインデックス

【 ポイント 】 実行計画を確認する際、現在のデータ量に対して適切な方法が選ばれているかを判断する基準を持っておくことが重要です。

アルゴリズム得意なデータ量インデックス備考
Nested Loop 1件〜少量 必須 オンライン処理の基本
Sort Merge 大量データ あれば尚可 ソートのCPU負荷あり
Hash Join 大量データ 不要 メモリ(ワークエリア)を消費

3. パフォーマンス改善:DBへの介入術

通常、DBは統計情報を元に自動で判断しますが、判断を誤ることもあります。その際、エンジニアが特定のアルゴリズムを強制・誘導する方法は製品ごとに異なります。

[ 製品別の介入方法 ]
Oracle(ヒント句):/*+ USE_NL(a b) */ のように、SQL内に直接指示を書き込みます。
PostgreSQL(パラメータ):SET enable_mergejoin = off; 等で特定の機能を無効化し誘導します。
MySQL(インデックスヒント):USE INDEX を指定することで、間接的にNLJなどへ誘導します。


結合アルゴリズムの仕組みを知ることは、スロークエリの根本原因を特定し、最適なパフォーマンスを引き出す第一歩となります。


PR