SQL Server数据透视与多重联接 [英] SQL Server pivot vs. multiple join

查看:249
本文介绍了SQL Server数据透视与多重联接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在SQL Server 2005中使用哪种更有效的方法:PIVOT或MULTIPLE JOIN?

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

我可以使用PIVOT进行同样的操作:

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

哪个会更有效?

推荐答案

答案当然是取决于",但基于对这一目标的测试...

The answer will of course be "it depends" but based on testing this end...

假设

  1. 一百万种产品
  2. productproduct_id
  3. 上具有聚集索引
  4. 大多数(如果不是全部)产品在product_code表中具有相应的信息
  5. product_code上存在两个查询的理想索引.
  1. 1 million products
  2. product has a clustered index on product_id
  3. Most (if not all) products have corresponding information in the product_code table
  4. Ideal indexes present on product_code for both queries.

PIVOT版本理想地需要索引product_code(product_id, type) INCLUDE (code),而JOIN版本理想地需要索引product_code(type,product_id) INCLUDE (code)

The PIVOT version ideally needs an index product_code(product_id, type) INCLUDE (code) whereas the JOIN version ideally needs an index product_code(type,product_id) INCLUDE (code)

如果这些到位,请给出下面的计划

If these are in place giving the plans below

然后JOIN版本更有效.

如果type 1type 2是表中唯一的types,则PIVOT版本在读取次数方面略有优势,因为它不必查找两次,但这远远超过了流聚合运算符的额外开销

In the case that type 1 and type 2 are the only types in the table then the PIVOT version slightly has the edge in terms of number of reads as it doesn't have to seek into product_code twice but that is more than outweighed by the additional overhead of the stream aggregate operator

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.

如果除12之外还有其他type记录,则JOIN版本将增加其优势,因为它只是合并了type,product_id索引相关部分上的联接,而PIVOT计划使用product_id, type,因此必须扫描与12行混合的其他type行.

If there are additional type records other than 1 and 2 the JOIN version will increase its advantage as it just does merge joins on the relevant sections of the type,product_id index whereas the PIVOT plan uses product_id, type and so would have to scan over the additional type rows that are intermingled with the 1 and 2 rows.

这篇关于SQL Server数据透视与多重联接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆