ソート・マージ結合、マニュアル上では、ソート/マージ結合と書かれている。英文は Sort Merge Joins である。 これはマージソートと混同するのを嫌ったのだろうか?意図は良くわからない。 (ソート/マージ結合には少し違和感があるので、以下 ソート・マージ結合として書いてしまいます。)
ソート・マージ結合とは、表現するならば、ある 2 つの表を結合キーでソートし 2 つの行セット同士をバッファという会場で 集団お見合いさせて、そこから大量のカップルをごっそりと生み出すようなものであると考えるとわかりやすい。
下の図は「部門一覧表」と「利用者一覧」を「部門 (DEPT_ID)」の等価結合 (=)によってソート・マージ結合させているイメージ図である。 (この例ではマッチングの会場には席がひとつしかない)
▼DEPT_ID をキーにしたソート・マージ結合の動作イメージ(シングルスレッド) SELECT /*+ USE_MERGE(A B) */... FROM A, B WHERE A.DEPT_ID = B.DEPT_ID ソート・マージ結合の動作イメージ(javascriptが無効のため表示できません)
この例はシンプルでわかりやすく表現しているため処理の無駄も多い。(フラッシュを手抜きしたいというのもある) それに以前に、実は等価結合(=)ではソート・マージ結合は、ほとんど選択されない。 一般的な等価結合ではハッシュ結合の方がソート・マージ結合より効率的であるから…
また Oracle ではソート・マージ結合は、よりスマートで効率的に結合処理が行なわれているのは想像に難しくない。 (フラッシュではイメージしやすいように選択ソートもどきで行セットをソートしている) Oracle 10g からマニュアルのソート・マージのコストの計算式が微妙に変わっているので変更されているかもしれないが、 以前は N×LOG(N) + M×LOG(M) というコストであった。
マニュアルから察することができる内容からイメージ図において注意しておきたい点は 3つ ソート処理を完了することなく結合を完了できる 等価結合では一般的にハッシュ結合が有利 ソート・マージ結合のためにソート処理が発生する場合には効率が悪い
マニュアルから察することができる内容からイメージ図において注意しておきたい点は 3つ
(※1) 索引構成表、または、ソート済みハッシュクラスタ
(※2) UNION , INTERSECT 他 / DISTINCT / GROUP BY / インラインビュー・分析関数などを使った各種 SQL
JavaScript が無効になっているためページ内の動的コンテンツは表示されていません。また印刷ページにも移動できません。