入れ子ループ結合は入れ子反復とも呼ばれ、一方の結合入力を外部入力テーブル(グラフィカルな実行プランでは一番上の入力として表示されます。 外側ループは外側入力テーブルを1行ずつ消費します。 内側ループは外側の行ごとに実行され、内側の入力テーブルから一致する行を検索します。 以下のリストは、入れ子ループ結合を生成する例です。

--Nested Loop Join SELECT C.CustomerID, c.TerritoryID FROM Sales.SalesOrderHeader oh JOIN Sales.Customer c ON c.CustomerID = oh.CustomerID WHERE c.CustomerID IN (10,12) GROUP BY C.CustomerID, c.TerritoryID

注意: これは wrox.com でダウンロードできます。

Wiley Admin 13_26

Figure 1. Nested Loop Joinのサンプル実行プラン

入れ子ループ結合は、外側の入力が小さく、内側の入力がソートされて大きい場合に特に効果的です。 小さな行のセットだけに影響するような多くの小さなトランザクションでは、インデックス付き入れ子ループジョインはマージジョインとハッシュジョインの両方よりも優れています。 しかし、大きなクエリでは、入れ子ループ結合は最適な選択ではないことがよくあります。 もちろん、実行プランに入れ子ループ結合演算子があるからといって、それが効率的なプランであるかどうかはわかりません。 ネストされたループ結合はデフォルトのアルゴリズムです。 これは最初に使用されるアルゴリズム(これはメモリ内ハッシュ結合です)ではなく、他のアルゴリズムが特定の条件にマッチする場合に常に適用されることを意味します。 例えば、”requires join” アルゴリズムはequijoinでなければなりません。 (結合条件は等号演算子に基づいています。)

この例のクエリでは、CustomerIDが10または12である外側テーブルCustomerに対してクラスタ化インデックス検索が行われ、各CustomerIDに対して内側テーブルSalesOrderHeaderに対してインデックス検索が実行されています。 したがって、インデックスIX_SalesOrderHeader_CustomerIDは、SalesOrderHeaderテーブル上で2回(CustomerID 10に対して1回、CustomerID 12に対して1回)シークされます

Articles

コメントを残す

メールアドレスが公開されることはありません。