Таблица значений Функция, где мой план запроса пошел? - PullRequest
4 голосов
/ 16 сентября 2009

Я только что обернул сложный оператор SQL в табличную функцию в SQLServer 2000. При просмотре плана запроса для SELECT * FROM dbo.NewFunc он просто дает мне сканирование таблицы созданной мной таблицы.

Я предполагаю, что это потому, что таблица создается в базе данных tempdb, и я просто выбираю из нее.

Так что запрос просто:

SELECT * FROM table in tempdb

Мои вопросы:

Использует ли UDF тот же план, что и сложный оператор SQL?

Как я могу настроить индексы для этого UDF?

Могу ли я увидеть истинный план?

1 Ответ

6 голосов
/ 16 сентября 2009

Табличные функции с несколькими операторами (TVF) являются черными ящиками для оптимизатора для внешнего запроса. Вы можете видеть только IO, CPU и т. Д. Из профилировщика.

TVF должен завершиться и вернуть все строки, прежде чем произойдет какая-либо обработка. Это означает, что предложение where не будет оптимизировано, например.

Так что, если этот TVF возвращает миллион строк, он будет отсортирован первым.

SELECT TOP 1 x FROM db.MyTVF ORDER BY x DESC

Отдельные операторы / встроенные TVF не страдают, поскольку они расширяются как макросы и оцениваются. В приведенном выше примере оцениваются индексы и т. Д.

Также и здесь: Работает ли оптимизатор плана запросов с объединенными / отфильтрованными табличными функциями? и Относительная эффективность JOIN против APPLY в Microsoft SQL Server 2008

Чтобы ответить точно: нет, нет и нет

У меня очень мало TVF с несколькими операторами: там, где я делаю, у меня есть много параметров для фильтрации внутри UDF.

...