Qu'est-ce qui est plus efficace à utiliser dans SQL Server 2005: pivot ou jointure multiple?
Par exemple, j'ai reçu cette requête en utilisant deux jointures:
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
Je peux faire la même chose avec 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
Lequel sera plus efficace?
La réponse sera bien sûr "cela dépend" mais basée sur les tests de cette fin ...
En supposant
product
a un index en cluster sur product_id
product_code
product_code
pour les deux requêtes.La version PIVOT
a besoin idéalement besoin d'un index product_code(product_id, type) INCLUDE (code)
Alors que la version JOIN
nécessite idéalement un index product_code(type,product_id) INCLUDE (code)
Si ceux-ci sont en place donnant les plans ci-dessous
ensuite, la version JOIN
est plus efficace.
Dans le cas où type 1
et type 2
sont le seul types
dans la table, la version PIVOT
a légèrement le bord en termes de nombre de lectures car il n'est pas nécessaire de rechercher dans product_code
deux fois mais qui est plus que dépassé par les frais généraux supplémentaires de l'opérateur agrégé par le flux
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.
S'il existe d'autres type
registres autres que 1
et 2
la version JOIN
augmentera son avantage comme il le fait que la fusion se joint aux sections pertinentes de l'indice de type,product_id
alors que le PIVOT
Plan utilise product_id, type
et il suffirait de numériser sur les rangées supplémentaires type
qui sont mélangées avec les lignes 1
et 2
.