ハッシュは同じ接続のために、とだけCBO最適化モードでのみ参加します。ネストされたループへの相対は、ハッシュが大きな結果セットを処理するのに適し参加し、参加する
実施計画をハッシュ結合を、一般的な外観に呼び出すことはありません、最初のハッシュテーブル(ビルドテーブル)、第2のプローブのテーブル(プローブ表)であるネストされたループのみルック内の
ハッシュテーブルは、テーブルとして知られている、いわゆるプローブテーブル外観
:実行計画では、どちらの形の
ネストされたループ
テーブル駆動-外部テーブル
内部テーブルの
結合、ハッシュ
テーブル(内部テーブル)を作成-テーブル駆動
プローブテーブル(外部表)
プロセスのハッシュの一般的な理解が参加し、絵を見てください:
ここに参加し、よりハッシュについて学びます
ハッシュ私概念参加
Hアルゴリズムの基本的な考え方は、灰に基づいて参加小行ソース(すなわち、我々は小さなテーブルS、大きなテーブルBでの書き込み前述ビルド入力ビルドテーブルと呼ぶ)
を確立することハッシュ領域は、メモリ内のハッシュテーブルに存在してもよく
、その後、ハッシュテーブルを検出するために以前に構築された(すなわち、前述のプローブテーブルプローブ入力と呼ぶ)が大きい行ソースを使用して
ハッシュテーブルはないので、ハッシュ・エリア・メモリが十分な大きさでない場合エリアハッシュが完全にメモリに記憶されている
このような状況のために、ビルド入力とプローブ入力にハッシュ関数を使用してオラクル結合が互いに素な複数のパーティションに分割されているが
、それぞれと、SiとのBiと呼ばれ、この段階では、分割フェーズと呼ばれパーティション、SiとBiは、ハッシュ参加ください。このステージは、ステージと呼ばれる参加
ハッシュテーブルがメモリに大きすぎA構造であれば、それはいくつかのパーティションに分割され、ディスクに書き込まれた一時セグメント、それはもう一つの価格を書きます効率の低下
ハッシュのための小さなテーブルの概念として、参加、それは典型的には、例えば、プチテーブルがあってもよいハッシュテーブルPGA内に収容することができる。
pga_a 大きな整数1073741824をggregate_target
大きな物理的に使用するハッシュ領域サイズ40以上のM、ので、通常のレコードの数十万人収容できる
2 * SORT_AREA_SIZEにハッシュ領域サイズのデフォルトを、私たちは直接サイズSORT_AREA_SIZEを変更することができ、HASH_AREA_SIZEも変更されます
場合は、あなたのWORKAREA_SIZE_POLICYを=オートは、その後、我々は単にPGA_AGGREGATE_TARGETを設定する
が、覚えて、これは時々 、私たちは約1.6倍、テーブル駆動するHASH_AREA_SIZEのサイズを設定する傾向があり、セッション・レベルのパラメータである
駆動型のネストされたループ結合だけのためにテーブルやハッシュを参加するが、ハッシュインデックスの必要性を参加ドライブテーブルの上に存在すること、およびネストされたループではないがの緊急のニーズに参加
結合テーブルに記録百万二から千万レコードをテーブルが参加し、ハッシュすることは非常によく行う通常
大きな、より少ない労力で、しかし、そして定量化することがしばしば困難な、小さな、状況が特定の分析を持って
、パーティションの後、ハッシュテーブルのために構築されたパーティションが大きすぎると、ハッシュ結合ループのネストされたの使用上のOracle
のハッシュは、いわゆるネストされたループに参加をしていますSiの部分確立ハッシュテーブル、そしてメイク接続を構築し、すべてのBiのハッシュテーブルを読み込み
、その後に Siを介して接続されているすべてのBiのハッシュテーブルを構築し、すべてのSiまで接続を行うために、ハッシュテーブルを確立し、残りの
(ⅱ)ハッシュの原理が参加
試験は:データの次の二つのセット考える
S = {1,1,1,3,3,4,4,4,4,5,8,8,8,8,10}
、B = {0,0,1 } 1,1,1,2,2,2,2,2,2,3,8,9,9,9,10,10,11
ハッシュの最初のステップは、参加小さなテーブル(すなわち、ビルド入力)場合に決定されますハッシュ領域が完全に、メモリに記憶することができる
完全にメモリに記憶されている場合、最も簡単なハッシュであるメモリ内のハッシュテーブルの確立は、参加
すべてのメモリに記憶されていない場合、ビルド入力が分割されなければなりません。OUT-ファンと呼ばれるパーティションの数、
ファンHASH_AREA_SIZE-OUTは、決定し、クラスタサイズです。クラスタサイズは* _hash_multiblock_io_countのDB_BLOCK_SIZEのに等しい
HASH_MULTIBLOCK_IO_COUNTは9.0.1もはや使用後に、隠されたパラメータであり、
-
SYS @ ORCL>編
-
AFIEDT.BUFファイルを書きました
-
-
1 選択a.ksppinm 名、b.ksppstvl 値、a.ksppdesc説明
-
2 X $ ksppi Aから、$ ksppcv bはxは
-
3 ここでa.indx = b.indx
-
4 * とa.ksppinm \などの'%HASH_MULTIBLOCK_IO_COUNT%\'
-
SYS @ ORCL> /
-
-
名前値説明
-
------------------------------ ----- --------------- ---------------------------------------------
-
ブロックハッシュの_hash_multiblock_io_count 0数が読まれます/書き込みを一度に参加します
内部のOracleは、ハッシュ関数を使用して、結合に適用され、SとBが複数のパーティションに分割され
、すなわち、MOD(join_column_value、10)、我々は、ハッシュ関数は、残りの関数であると仮定し
、以下のようにこのように、10のパーティションを生成します。
こうしたパーティションの後、あなただけのそれぞれのパーティション間(いわゆるパーティションのペア)に参加するために必要な
パーティションがある場合はNULLで、それに対応するパーティションを無視することができる参加
Sパーティションテーブルがメモリに読み込まれたときに、オラクル即ち一意の値連結記録、いわゆるビットマップ構築されたベクター
、メモリの約5%ハッシュ領域のアカウントを取ります。ここで、{1,3,4,5,8,10}で
ない場合、それは廃棄記録する場合Bパーティションテーブル、図リンケージ比較のそれぞれにおけるビットベクトルの値
にはこの例では、Bテーブルに次のデータが破棄される} {0,0,2,2,2,2,2,2,9,9,9,9,9
このプロセスは、ビットマップ・ベクトルを濾過し
、S1と完成コネクタB1、次に、Siの後、Biの接続
ここでは、Oracleは、2つのパーティションを比較し、ビルド入力を行うこと小さな選択し、動的な役割の逆転であるだろう
、このダイナミックな役割の反転は、パーティションの上記の最初のパーティションに加えて、発生しました
(III)ハッシュアルゴリズムがある参加
最初のステップ1:あなたは、その後、メモリハッシュ結合を行うことができれば、小さなテーブルは、メモリのハッシュ領域に格納することができ、すべてのかどうかを判断します。そうでない場合、第2段階のスイッチ
ステップ2:ファンアウトの数を決定し
(パーティションの数)* C < = Favm * M
Cは、クラスタサイズである、* HASH_MULTIBLOCK_IO_COUNTの値DB_BLOCK_SIZE
メモリのパーセンテージとしてFavmハッシュ領域は、使用することができます通常約0.8
HASH_AREA_SIZEサイズのM
小さなテーブル読取部S、(hash_fun_1と呼ぶ)内部ハッシュ関数を使用して:ステップ3
接続hash_fun_2プロデュース追加のファンクションキーを使用しながらパーティションにマッピングされたキー値を結びますハッシュ値を
ハッシュ値は、ハッシュテーブルを作成するために使用され、接続キーと一緒に格納される
ステップ4:ビルド入力ビットマップ・ベクトルの確立
ステップ5:メモリに空きがない場合、パーティションがディスクに書き込まれます。
ステップ6:小さなテーブルSの残りの部分を読んで、第三の工程は、全ての読み出し小さなテーブルSまで繰り返されます
ステップ7:パーティション(ここでは原理はアップ選択されたパーティションの数を選択することである)複数のパーティション・ハッシュ・テーブルを確立するために選択され、サイズによってソート
ステップ8:hash_fun_2関数を計算し、以前のハッシュ値によれば、ハッシュテーブルを
9ステップ:ビットマップ・ベクトルベクトル濾過ビットマップで、テーブルBを読み出す
ステップ10:フィルタ処理されたデータを使用して、データのhash_fun_1関数はに対応するパーティションにマッピングされ、ハッシュ値hash_fun_2の計算された
ステップ11:場合メモリパーティション立ち下がり、その後、既存の接続にして得られた正面及びメモリハッシュテーブルのハッシュ値は、によって算出hash_fun_2機能行う
ディスクアクチュエータに書き込まれた結果を。パーティションは次いで一緒にSの値に対応した対応するパーティションテーブルは、メモリ内に落下されていない場合は
ステップ12:表Bは、繰り返しステップ9を読み取る続け、表Bにまで読み取られた
読み取り:ステップ13対応するシリコン(Si、BI)ハッシュ結合します。ここで動的役割反転が発生し
、ステップ14:パーティション後、ネストされたループのハッシュよりも小さいパーティションに大きなメモリが発生した場合、参加します
(IV)ハッシュは、コスト参加
⑴メモリ内ハッシュ参加
費用(HJ)を読む(S)= +リード(B)+は、(CPU)の参加でメモリを実行+メモリ内のハッシュテーブル(CPU)をビルドします
:そして、CPU時間を無視して
コストを(HJ)を読み出し(S)+リード(B)=
⑵オンディスクをハッシュ結合
上記の手順に従って、我々が見ることができます:
コスト(HJ)=コスト(HJ1)+コスト(HJ2)
ここで、コスト(HJ1)のコストはスキャンS、Bのテーブルであり、メモリがディスクに書き込まれた部分に配置することができない、ステップと、以前のステップ2に対応する12
のコスト(HJ2)は、ネストされたループハッシュジョインことのコスト、対応するフロント部13でありますステップ14、ステップ
コスト(HJ1)を読み出す(S)+リード(Bにほぼ等しい )+書き込み((SM)+(BB * M / S))
、ネストされたループのハッシュを行うことで、各チャンクのために、参加するためしたがって、ビルド入力、プローブ全体の入力を読み込む必要があり、
コスト(HJ2)読み出し((SM)+ N *にほぼ等しい (BB * M / S))、 ネストされたループのハッシュの数はループの必要性を参加さN:N =(S / F) / M
で一般、もしNハッシュ性能が大幅に削減されるであろう参加、10ワードよりも大きい
N、の式から理解することができ、ファンアウトに反比例する、増加ファンアウトを低減することができるN
HASH_AREA_SIZEが固定されている場合に、ファンを高めるためにクラスタサイズを小さくすることができます-out
ここから私たちは、それが必ずしもハッシュのパフォーマンスが参加し改善されないHASH_MULTIBLOCK_IO_COUNTパラメータ値を向上させる見ることができます
(V)ハッシュは、プロセス参加:第二完全ハッシュとして以下参加ゾーン1(バケット)の点が小さなテーブルを--hashバレルの数を計算するために ハッシュが小さいパーティションテーブル(バケット)の数に参加決定する重要な因子 HASH_MULTIBLOCK_IO_COUNT、HASH_AREA_SIZEによってこの数をそして、DB_BLOCK_SIZEパラメータが一緒に決定 Oracleはストレージパーティション、ハッシュビットマップ情報、およびハッシュテーブルにハッシュエリアヘッダ情報20%を保持 したがって、この数値を算出する: 数バケット= 0.8 * HASH_AREA_SIZE /(HASH_MULTIBLOCK_IO_COUNT * DB_BLOCK_SIZE)2ハッシュ計算 小さなリード・テーブル・データを(Rと呼ばれる)、及び各データは、ハッシュアルゴリズムから計算され たハッシュ値(第1のハッシュ値と第2ハッシュに到達する最速の速度を計算するために、2つの計算されたハッシュアルゴリズムを使用して、Oracle値) 及びこれらのパーティションハッシュテーブルの全てのハッシュ値(第1のハッシュ値に対して)となるメモリのハッシュにデータを格納する3 入れ、ハッシュアルゴリズムを介してデータを各バケットのハッシュ値(第1のハッシュ値)に応じて各バケット 第2のハッシュ値は、各レコード内に格納されます。
4ハッシュビットマップを作成して
2つのハッシュ値のマッピングにハッシュビットマップを作成し、同時に
メモリサイズ部分の5 OUTがディスクに移動され
、ハッシュ領域は、書き込まれる最大パーティションを充填されている場合アップディスク(一時テーブルスペース)
任意のレコードは、ディスクパーティションディスクパーティションが原因更新されたに書き込まれる必要があります
ので、このような状況を避けるために試してみてください、このような場合は、それは真剣にパフォーマンスに影響します
データのテーブル全体まで2-5完全な読み
ソートパーティションの6組の
メモリをフルに活用するためには、複数のパーティションを保存しようとすると、Oracleは各パーティションのサイズに応じてメモリにそれらをソートします
7ハッシュマッチは、大きなテーブルのデータを読み込み、
その後、大規模な読み始めました(Sと略す)データシートれる
順次メモリのパーティションにハッシュ値が一致するか否かを、各レコード、その算出したハッシュ値、およびチェックを読み取る
ことは、データを結合するための復帰である場合
、メモリパーティションが一致しない場合には、それ新しいパーティションへのS書き込みデータは、パーティションRはまた、ハッシュ値を計算するために、同じアルゴリズムの計算のために使用された
これらのSの数であります 生産するパーティションの新しい番号とR.の同じセットそのパーティションの数 新しいパーティションは、ディスク(一時表スペース)に格納されている
すべてのデータがフル8つの大きなテーブル読み取るために
大きなテーブルが完了するまで、すべてのデータを読み取り、7に従って行われているが
9つのプロセスデータは参加しない
Rから良いデータを結合し、算出した今回は、パーティションの多くを生成し、Sは、ディスク上に格納されている
算出二次ハッシュの10
R及びSパーティションから、最小のパーティションを抽出濃縮作成するために、メモリ内の第2のハッシュ関数およびハッシュテーブルを使用して計算
より良い分布データを作成する第2のハッシュ関数を使用する理由である
11試合第2のハッシュ
メモリ内の別のデータソースから(ハッシュをそのパーティションこれは、メモリ内の新しいハッシュ・テーブルに一致する、データパーティションを読み出すために)別のデータソースに属しています。戻り値のデータに参加
フルハッシュを完了するために12に参加する
すべて処理されるまで、プロセスに残り9-11パーティションに従うことを続けます
(VI)ハッシュモードの参加
Oの最適、ワンパス、マルチパス:ハッシュ結合、中racleには3つのモードがあり
⑴最適を
:駆動結果セットが最適と呼ばれるすべてのハッシュテーブルハッシュ領域PGA、に配置することができる場合に、実質的に以下の
①、結果セットが駆動され、第一の駆動テーブル
ハッシュハッシュbulketエリアを生成する②、及びbulket複数に分割されていますグループは、パーティションとして、また、ビットマップのリストを生成し、トップbulketを表すそれぞれが
結果セットは、ハッシュ関数を実行③キージョイン、データはbulketの各パーティションに分散
操作が完了したとき、キー値と、高い、bulketの単語のみデータがより均一になるであろう場合、いくつかのデータがあってもよいが空のバケットの内部になり
、このビットマップのフラグに対応データのバケットがあり、0であり、フラグが1であろう
秒のスキャンを開始④ jionのテーブルは、ハッシュキー操作を行う、検出するbulketのパーティションを決定するべきである
プローブが0の場合bulketは、ビットマップは何もデータがないことを示す、1になりますかどうかを見ていきます前に、この行は、直接捨て
⑤ビットマップが1である場合には、データを返す、[OK]を決意した後、バレルに完全一致を行い
、最適なハッシュ結合され、彼のコスト、実質的に二つのテーブル全表スキャン、ハッシュ計算の微量添加すること
、この場合の数字のブログの開口を用いて記載されています
⑵ワンパス
小さなPGAプロセスであれば、ドライブまたは結果セットを見ては、あなたがどのように行うだろう、より多くのハッシュ領域のサイズよりも大きいのですか?
もちろん、その後、パーティションの注目オーストリアの概念は、上記の少し複雑なニーズがオラクルに近づき、一時テーブルスペースを使用します
理解することができ、データは2つのハッシュ演算の結果であり、必ずあなたのパーティションを作成し、次に決定あなたのbulketは、
パーティションハッシュ領域全体のハッシュテーブルよりも小さいが、サイズよりも少なくとも大きいと想定し、移動するには、この時間は、1パスで
我々は良いハッシュテーブルを生成するとき、状況がメモリに残って、他のパーティションがディスクに残っているパーティションの一部であり、一時テーブルスペース
はもちろん、半分のメモリに半分のディスクパーティションがあるかもしれない、残りのステップは次の通りされている:
①ん、第二のテーブルをスキャンし、ハッシュファンクションキーへの参加を、パーティションとbulket対応良い決定
②ビットマップを表示し、 bulketデータを直接破棄されていないかどうかを判断する
そうでない場合、そこにデータであり、パーティションが、戻りラインのデータと一致するように正確に一致させるために、対応するバケットを入力して、メモリ内にある場合、③廃棄を
パーティションがある場合④ 、その後、ディスク上にステージングディスクへのデータのこのラインは、パーティション、BUの形で格納されています lketの道
⑤第2スキャンテーブルは、残りのテーブルを完了し、プローブによって生成されたパーティションテーブルの多くを駆動し、ディスク上に残っている場合
⑥データパーティションので両側に、今だけ、同じハッシュアルゴリズムbulketを行っていますパーティションデータの両側のペアワイズ比較
し、比較の際には、オラクルも最適化プロセスは、ドライブおよびドリブンの間に厳密な関係が存在しない
、彼はパーティションに駆動されるすべてのディスクまで、小さな一組を選択すべての参加が完了するパーティションは
、最適に比べて、見つけることができる彼に余分なメモリを要するので、1パスと呼ばれ、後に再読み込み、パーティションに適合されていない
オラクル、長くお使いのメモリがパーティションを保持することが保証されるよう演習のための部屋になり、各ディスクのパーティションを行う-1パス
⑶マルチパス
、これは最も複雑で、最悪のハッシュ結合
も適合していなくても小さなパーティションにこの時間ハッシュ領域では、スキャンテーブルの後に良いドライブは
半分だけかもしれパーティションは、他の半分を加えたディスク上の他のパーティションはすべてで、ハッシュ領域に残る
パルティを除き、同様の残りのステップとワンパスパリティ ションプロセス
メモリに半分だけパーティションテーブルを駆動するため、対応するパーティションテーブルのデータ検出プローブが行います
マッチが上にない場合は、この行は、ディスクを保持する必要があるため、直接捨て、半パーティションテーブルの残りの部分をドライブすることはできませんジョインん
ここで例示するあまり、再度、ロードされた場合、半分のパーティションのメモリを保持することができています参加倍以上になり
、マルチパスが発生した場合、物理的な時間のパーティションの数が大幅に増加します
ビットマップ結合(VII)ハッシュ
これらのビットマップは、各ハッシュ・パーティションはいはい値かどうかについての情報が含まれています。これは、データ・パーティションのハッシュ値を記録し
、このビットマップの最大の役割は、プローブの入力データと一致するハッシュテーブル内のメモリにはない場合、すなわち
最初のビットマップをチェックし、一致するデータがディスクに書き込まれていないが存在するかどうかを決定します
これらのデータと一致していない(ビットマップ、それぞれのパーティションには何のデータが)もはやディスクに書き込まれません
(VIII)の概要は、
①小さなテーブルがテーブル駆動され、確認
②確認は表にし、連携に関連して分析
連携に③場合凹凸のデータ、ヒストグラムを行うことが推奨され
ている場合④、サイズや大型HASH_AREA_SIZE PGA_AGGREGATE_TARGETの値を調整
⑤ハッシュを大きな結果セットを返す、大きなテーブルと小さなテーブルを接続するようになって入会が接続されています
ます。http://blog.itpub.net/26515977/viewspace-1207979/で再現