HashJoin は、2 つの入力のうち小さい方のイン・メモリ・ハッシュ・テーブルを作成してから、大きい方の入力を読み込みます。次に、イン・メモリ・ハッシュ・テーブルを調査して一致するローを検索します。見つかったローはワーク・テーブルに書き込まれます。小さい方の入力がメモリに収まらない場合は、HashJoin によって両方の入力が小さなワーク・テーブルに分割されます。これらの小さくなったワーク・テーブルは、小さい方の入力がメモリに収まるようになるまで再帰的に処理されます。
また、HashJoin には次のような特性があります。
結果のすべてのローを計算してから、最初のローを返す。
ワーク・テーブルを使用するので、value-sensitive カーソルが要求されていない場合は insensitive セマンティックが提供される。
並列実行できる。
入力のローをロックしてからメモリにコピーする。
小さい方の入力がメモリに収まる場合は、大きい方の入力のサイズに関係なく、HashJoin のパフォーマンスが最高になります。通常、入力の一方が他方よりかなり小さいと予測される場合に、オプティマイザはハッシュ・ジョインを選択します。
特定のジョイン属性値を持つすべてのローを保持できるほど十分なキャッシュ・メモリがない環境で HashJoin を実行した場合、HashJoin は完了できません。この場合、HashJoin では中間結果が廃棄され、代わりにインデックスベースの NestedLoopsJoin が使用されます。小さい方のテーブルのローがすべて読み込まれ、それを使用してワーク・テーブルが調査され、一致するローが検索されます。このインデックスベースの方式は他のジョイン方式に比べてかなり低速です。また、オプティマイザはクエリの実行中にメモリ不足を検出すると、ハッシュ・ジョインを使用したアクセス・プランの生成を避けます。
HashJoin 演算子で使用できるメモリ容量は、サーバのマルチプログラミング・レベルとアクティブな接続の数によって異なります。SQL Anywhere でのスレッドとデータベース・サーバのマルチプログラミング・レベルの設定を参照してください。
メモリ不足のためにネスト・ループ方式が必要になると、パフォーマンス・カウンタの値が増分されます。このモニタ値を読むには、QueryLowMemoryStrategy データベースまたは接続プロパティ、または Windows パフォーマンス・モニタの [クエリ:メモリ不足時方式] カウンタを使用します。
HashJoin はメモリ不足状態の Windows Mobile では無効になります。
Windows パフォーマンス・モニタは、Windows Mobile では使用できません。
詳細については、接続プロパティとデータベース・サーバのマルチプログラミング・レベルの設定の「QueryLowMemoryStrategy」を参照してください。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |