Ответ 1
Ответ, конечно, будет "это зависит", но на основе тестирования этой цели...
Предполагая
- 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
plan использует product_id, type
и поэтому придется сканировать дополнительные строки type
, которые смешаны с строками 1
и 2
.