Вот MERGE, использующий результаты табличной функции:
MERGE
Table1 d
USING
dbo.tvf_Table1(@StartDate, @EndDate) s ON d.ID = s.ID
WHEN MATCHED THEN UPDATE
SET Dest1 = Src1, Dest2 = Src2, Dest3 = Src3
WHEN NOT MATCHED THEN INSERT
VALUES(ID, Src1, Src2, Src3);
В моей среде это заняло около 30 секунд (в среднем за три пробежки).
Вот то же самое MERGE, но на этот раз функция помещается в первую очередь во временную таблицу:
SELECT
*
INTO
#Temp1
FROM
dbo.tvf_Table1(@StartDate, @EndDate)
MERGE
Table1 d
USING
#Temp1 s ON d.ID = s.ID
WHEN MATCHED THEN UPDATE
SET Dest1 = Src1, Dest2 = Src2, Dest3 = Src3
WHEN NOT MATCHED THEN INSERT
VALUES(ID, Src1, Src2, Src3);
DROP TABLE #Temp1
Это заняло около 31 секунды (в среднем за три пробежки).
На самом деле, запуск 54 MERGE, подобных описанным выше, был на четыре минуты быстрее с временными таблицами, чем без.
Принимая во внимание, что это вряд ли научно, я бы ожидал, что добавление шага временной таблицы значительно замедлит запрос. В конце концов, данные перемещаются из А в В, а затем из В в С, а не прямо из А в С.
Что происходит за кулисами, которые могут вызвать это?