Ответ, конечно, будет "это зависит", но на основе тестирования этого конца ...
Предполагая
- 1 миллион продуктов
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
вдвое, но это больше, чем перевешивает дополнительные издержки оператора объединения потоков
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.
Если есть дополнительные type
записи, отличные от 1
и 2
, версия JOIN
увеличит свое преимущество, поскольку она просто объединяет объединения в соответствующих разделах индекса type,product_id
, тогда как PIVOT
В плане используется product_id, type
, поэтому придется сканировать дополнительные строки type
, которые смешаны со строками 1
и 2
.