SQL Server的枢轴与多重连接
在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
哪一个会更有效率?
答案当然是“取决于”,但基于testing这个目的…
假设
- 100万个产品
-
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
,但是超过了额外的重量stream聚合运算符的开销
枢
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.
join
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
logging, JOIN
版本将增加它的优势,因为它只是合并type,product_id
的相关部分的type,product_id
索引,而PIVOT
计划使用product_id, type
,因此必须扫描与1
行和2
行混合的附加type
行。
我不认为有人不知道你的索引和表的大小,哪一个会更有效率。
这就是说,而不是假设哪个更有效率,你应该分析这两个查询的执行计划。