Я собираюсь сосредоточиться на различиях с фактическими планами выполнения. Все, что находится справа от адаптивного соединения, точно так же (включая адаптивное соединение). Оба запроса получили / запросили одну и ту же память.
При использовании «математического» запроса вместо запроса «IIF» возникает дополнительный скаляр. Вычислительный скаляр, выполняющий математические вычисления, требует дополнительного процессорного времени 4 мс. Это делает его более дорогим, но лишь незначительно.
<RunTimeCountersPerThread
Thread="0"
ActualRows="13944"
Batches="16"
ActualEndOfScans="0"
ActualExecutions="1"
ActualExecutionMode="Batch"
ActualElapsedms="4"
ActualCPUms="4"
ActualScans="0"
ActualLogicalReads="0"
ActualPhysicalReads="0"
ActualReadAheads="0"
ActualLobLogicalReads="0"
ActualLobPhysicalReads="0"
ActualLobReadAheads="0"/>
Если посмотреть на «дополнительный скаляр математических вычислений», мы увидим, что он также страдает от implicit_conversion. На данный момент это может быть не большой проблемой, но может занять несколько миллисекунд. c Это стало бы более проблематичным, если бы *1047* не использовалось правильного индекса, что не так.
CONVERT_IMPLICIT(numeric(3,0),[ELSA].[core].[ds_hours_load_type].[is_power_demand_high_load_06_22] as [load_type].[is_power_demand_high_load_06_22],0
Эта стоимость (дополнительный скаляр вычислений и неявное преобразование) передается в затем выполните scalar и ha sh match и все остальные слева операторы. У кого есть немного больше оценочной работы, если вы посмотрите на примерную стоимость поддерева ( запрос долларов )
Вычислите разницу в стоимости скалярного поддерева
- Математика: 1,02816
- IIF: 1,02801
Разница в стоимости поддерева HashMatch
- Математика: 1,04213
- IIF: 1,04182
При более глубоком рассмотрении XML планов выполнения. Мы видим что-то дополнительное для запроса «IIF».
<WaitStats>
<Wait WaitType="PAGEIOLATCH_SH" WaitTimeMs="24" WaitCount="1"/>
<Wait WaitType="RESERVED_MEMORY_ALLOCATION_EXT" WaitTimeMs="1" WaitCount="164"/>
</WaitStats>
Это означает, что запрос «IIF» загружался с диска и также ждал получения некоторой памяти. Я предполагаю, что вы сначала выполнили «IIF», а затем «Math». Делаем все страницы доступными в пуле буферов для второго запроса.