What is more efficient to use in SQL Server 2005: PIVOT or MULTIPLE JOIN?
For example, I got this query using two joins:
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
I can do the same using 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
Which one will be more efficient?
The answer will of course be “it depends” but based on testing this end…
Assuming
producthas a clustered index onproduct_idproduct_codetableproduct_codefor both queries.The
PIVOTversion ideally needs an indexproduct_code(product_id, type) INCLUDE (code)whereas theJOINversion ideally needs an indexproduct_code(type,product_id) INCLUDE (code)If these are in place giving the plans below
then the
JOINversion is more efficient.In the case that
type 1andtype 2are the onlytypesin the table then thePIVOTversion slightly has the edge in terms of number of reads as it doesn’t have to seek intoproduct_codetwice but that is more than outweighed by the additional overhead of the stream aggregate operatorPIVOT
JOIN
If there are additional
typerecords other than1and2theJOINversion will increase its advantage as it just does merge joins on the relevant sections of thetype,product_idindex whereas thePIVOTplan usesproduct_id, typeand so would have to scan over the additionaltyperows that are intermingled with the1and2rows.