Я чем-то смущен. Я использую T-SQL и пытается оптимизировать код, который выглядит следующим образом:Вызов функции табличной таблицы T-SQL в несколько раз быстрее, чем вызов один раз?
SELECT * FROM MyTable mt
LEFT JOIN
(SELECT * FROM Table1 t1
LEFT JOIN api.tableValuedFunc(@someArgs) tvf
on tvf.Key = t1.Key) firstJoin
on mt.Key = firstJoin.key
LEFT JOIN
(SELECT * FROM Table2 t2
LEFT JOIN api.tableValuedFunc(@someArgs) tvf
on tvf.Key = t2.Key) secondJoin
on mt.Key = secondJoin.key
делая это:
declare @tvfResult TABLE (... some columns ...)
insert into @tvfResults SELECT * FROM api.tableValuedFunc(@someArgs);
SELECT * FROM MyTable mt
LEFT JOIN
(SELECT * FROM Table1 t1
LEFT JOIN @tvfResults tvf
on tvf.Key = t1.Key) firstJoin
on mt.Key = firstJoin.key
LEFT JOIN
(SELECT * FROM Table2 t2
LEFT JOIN @tvfResults tvf
on tvf.Key = t2.Key) secondJoin
on mt.Key = secondJoin.key
Это удваивает время, необходимое для выполнения! Почему это? Во втором примере я (наивно) предполагаю, что выполняю функцию наполовину так же часто. Существует ли какое-то волшебство SQL, которое происходит за кулисами, которые я разрушаю?
Оглядевшись, это, кажется, связано с https://stackoverflow.com/questions/4109152/table-valued-function-killing-my-query-performance Но рецепт в этом случае использовать временную таблицу, что я и делаю. –
ОК, видимо, это не временная таблица, а переменная таблицы, которая на тонну меньше. Однако все это нужно для работы в функции, поэтому я не могу использовать временные таблицы. Является ли вариант №1 столь же быстрым, как я собираюсь получить? –
Пожалуйста, подтвердите, действительно ли вы используете «SELECT *» в ваших измеренных запросах или просто используете его как стенографию в вопросе. Обратите внимание, что простое использование «SELECT *» может привести к серьезному поражению производительности из-за недоступности любых индексов покрытия. Затем, пожалуйста, приложите ACTUAL QUERY PLAN от SSMS для анализа. Как мы можем определить, что происходит без плана запроса или полного DDL для всех таблиц/представлений и т. Д.? –