[英]SQL Server pivot vs. multiple join
在SQL Server 2005中使用什么更有效:PIVOT还是MULTIPLE JOIN?
例如,我使用两个连接获得此查询:
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
,但这超出了额外的数量。流聚合运算符的开销
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
索引的相关部分上合并连接type,product_id
而PIVOT
计划使用product_id, type
,因此必须扫描与1
行和2
行混合的其他type
行。
我不认为任何人都可以告诉你,如果不了解你的索引和表大小,哪个会更高效。
也就是说,您应该分析这两个查询的执行计划,而不是假设哪个更有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.