Oracleメモ > 表結合の基礎知識

表結合の基礎知識(Oracle)

【関連】
 ・実行計画の読み方(Oracle)


Oracleの表結合の基本

Oracleの表結合は2つのデータ(表など)の結合結果を取得し、その結果とまた別のデータを結合する。という手順を繰り返していく事によって最終的な結果を得る。
尚、最初にアクセスされる表を駆動表(外部表)、その表に対して結合されるもう一方の表を内部表と呼ぶ。

join_order.png

また、ネステッドループ結合の場合は、最初の結合の一部の結合結果を持って次の結合を行う事が可能となっている。
※ソート・マージ結合の場合はソートを行う必要がある為、全ての結合結果が出る前に、次の結合を行う事はできない。

結合の種類

ネステッドループ結合

nl_join.png

表の一部分のデータを取得するような場合に効率の良い結合方法。
外部表の結合列の値から、(内部表の)索引を使用して内部表の対象レコードにアクセスする
外部表(駆動表)のデータが、ある程度絞り込めている場合は、索引を使用して内部表にアクセスできる為、高速に動作するが、
逆に外部表のデータが大量にある場合は、外部表の全レコード分の索引アクセスが発生する為、かえってコストがかかる。

ソート/マージ結合

merge_join.jpg

表の大部分のデータを取得するような場合に効率の良い結合方法。
それぞれの表のデータを結合条件列で並び替え、結果が等しいレコードをマージする事によって結果を取得する。
逆に(ネステッドループを使用して)外部表で数件のレコードに絞り込めるような場合は、ソートにかかるコストの方が大きくなる為、非効率な結合方法となる。
また、結合条件列に索引が作成されている場合には、事前のソート処理が不要となる為、パフォーマンスが良くなる。
ハッシュ結合が使用できない非等価結合(>や<など)を使用している場合に使用する。

ハッシュ結合

結合条件に等価条件(=)が指定され、かつ 大量のレコードを結合する場合に有効な結合方法。
まず、レコード数の少ない表の結合条件列にハッシュ関数をかけ、メモリ上にハッシュテーブルを作成する。
次に、もう一方の表の結合条件列にハッシュ関数をかけ、結合できるかをハッシュテーブルで確認し、ハッシュ値が等しいレコードを結合して結果を返却する。
サーバのマシンリソース(メモリ)に余裕がある場合には有効な結合方法だが、そうでない場合にはメモリ不足になり、
かえってパフォーマンスが低下する可能性もある為、ソート/マージ結合で期待するパフォーマンスが得られない場合に使用する。

効率の良い表結合とは

オンライン処理

オンライン系の多くの処理は、数件の結果を返す場合が多い事から、
駆動表で数件のデータに絞り込んだ上で、内部表に対してネステッドループ結合を行うようなアクセスパスが最適である場合が多い。

バッチ系処理

何処に索引を付けるべきか

索引は主に「駆動表のデータの絞り込み」と「内部表への結合」に使用される為、以下の列に索引を作成する事が望ましい。

  • 駆動表の絞り込み条件となる列
  • 内部表の結合条件となる列

添付ファイル: filejoin_order.png 350件 [詳細] filenl_join.png 329件 [詳細] filemerge_join.jpg 342件 [詳細]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-07-08 (日) 20:28:25 (4308d)