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?
I don't think anyone can tell you which will be more efficient without knowledge of your indexing and table size.
That said, rather than hypothesizing about which is more efficient you should analyze the execution plan of these two queries.
The answer will of course be "it depends" but based on testing this end...
Assuming
product
has a clustered index onproduct_id
product_code
tableproduct_code
for both queries.The
PIVOT
version ideally needs an indexproduct_code(product_id, type) INCLUDE (code)
whereas theJOIN
version ideally needs an indexproduct_code(type,product_id) INCLUDE (code)
If these are in place giving the plans below
then the
JOIN
version is more efficient.In the case that
type 1
andtype 2
are the onlytypes
in the table then thePIVOT
version slightly has the edge in terms of number of reads as it doesn't have to seek intoproduct_code
twice but that is more than outweighed by the additional overhead of the stream aggregate operatorPIVOT
JOIN
If there are additional
type
records other than1
and2
theJOIN
version will increase its advantage as it just does merge joins on the relevant sections of thetype,product_id
index whereas thePIVOT
plan usesproduct_id, type
and so would have to scan over the additionaltype
rows that are intermingled with the1
and2
rows.