SQL Server 2005でより効率的に使用できるもの:PIVOTまたはMULTIPLE JOIN?
たとえば、2つの結合を使用してこのクエリを取得しました。
SELECT p.name, pc1.code as code1, pc2.code as code2
FROM product p
INNER JOIN product_code pc1
ON p.product_id=pc1.product_id AND pc1.type=1
INNER JOIN product_code pc2
ON p.product_id=pc2.product_id AND pc2.type=2
私はPIVOTを使用して同じことを行うことができます:
SELECT name, [1] as code1, [2] as code2
FROM (
SELECT p.name, pc.type, pc.code
FROM product p
INNER JOIN product_code pc
ON p.product_id=pc.product_id
WHERE pc.type IN (1,2)) prods1
PIVOT(
MAX(code) FOR type IN ([1], [2])) prods2
どちらがより効率的ですか?
答えはもちろん「依存する」でしょうが、この目的のテストに基づいています...
想定
product
はproduct_id
にクラスター化インデックスを持っていますproduct_code
テーブルに対応する情報があります。product_code
に存在する理想的なインデックス。PIVOT
バージョンには、理想的にはインデックスproduct_code(product_id, type) INCLUDE (code)
が必要ですが、JOIN
バージョンには、理想的にはインデックスproduct_code(type,product_id) INCLUDE (code)
が必要です
これらが適切な場合、以下の計画を提示します
その場合、JOIN
バージョンの方が効率的です。
type 1
とtype 2
がテーブル内の唯一のtypes
である場合、PIVOT
バージョンは、product_code
を2回シークする必要がないため、読み取りの数の点でわずかにEdgeを持ちますが、追加のオーバーヘッドが上回るストリーム集約演算子
Table 'product_code'. Scan count 1, logical reads 10467
Table 'product'. Scan count 1, logical reads 4750
CPU time = 3297 ms, elapsed time = 3260 ms.
Table 'product_code'. Scan count 2, logical reads 10471
Table 'product'. Scan count 1, logical reads 4750
CPU time = 1906 ms, elapsed time = 1866 ms.
1
と2
以外の追加のtype
レコードがある場合、JOIN
プランはtype,product_id
を使用しているため、PIVOT
バージョンはproduct_id, type
インデックスの関連セクションで結合を結合するだけなので、その利点が高まるため、追加のtype
行をスキャンする必要があります1
および2
行と混在しています。
私は誰もあなたのインデックスとテーブルのサイズの知識なしでどちらがより効率的であるかをあなたに言うことができないと思います。
つまり、どちらがより効率的であるかについて仮説を立てるのではなく、これら2つのクエリの実行計画を分析する必要があります。