SQL Server数据库与多个连接

时间:2011-09-16 17:43:55

标签: sql-server performance sql-server-2005 join pivot

在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

哪一个会更有效率?

2 个答案:

答案 0 :(得分:30)

答案当然是“它取决于”,但基于测试这一目的......

假设

  1. 100万件产品
  2. productproduct_id
  3. 上有一个聚集索引
  4. 大多数(如果不是全部)产品在product_code
  5. 中都有相应的信息
  6. 两个查询的product_code上都有理想的索引。
  7. PIVOT版本理想情况下需要索引product_code(product_id, type) INCLUDE (code),而JOIN版本理想情况下需要索引product_code(type,product_id) INCLUDE (code)

    如果有以下计划,

    Plans

    然后JOIN版本效率更高。

    如果type 1type 2是表格中唯一的types,则PIVOT版本在读取次数方面略有优势,因为它没有不得不两次寻求进入product_code,但这比流聚合运算符的额外开销更重要

    PIVOT

    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.
    

    如果除type1之外还有其他2条记录,则JOIN版本会增加其优势,因为它只是在{的相关部分上合并连接{1}}索引,而type,product_id计划使用PIVOT,因此必须扫描与product_id, typetype混合的其他1行行。

答案 1 :(得分:5)

我不认为任何人都可以告诉你,如果不了解你的索引和表格大小,哪个会更有效率。

那就是说,不应该假设哪个更有效,你应该分析这两个查询的执行计划。