Разница между встроенной функцией и представлением - PullRequest
5 голосов
/ 12 июня 2009

Я новичок в использовании функций, и мне кажется, что встроенная функция очень похожа на представление. Я прав?

Кроме того, могу ли я иметь операторы UPDATE внутри функции?

Ответы [ 9 ]

16 голосов
/ 12 июня 2009

После прочтения многих ответов здесь я хотел бы отметить, что между встроенной табличной функцией и любой другой функцией (скалярной или многострочной TVF) существует большая разница.

Встроенный TVF - это просто параметризованное представление. Он может быть расширен и оптимизирован так же, как представление. Не требуется ничего материализовывать перед «возвратом результатов» или чем-то подобным (хотя, к сожалению, синтаксис имеет RETURN.

Большим преимуществом встроенного TVF по сравнению с представлением является то, что оно вызывает принудительную параметризацию, тогда как в представлении вы должны предполагать, что вызывающая сторона соответствующим образом присоединится или ограничит использование представления.

Например, у нас есть много больших таблиц фактов в DW с типичной звездной моделью Кимбалла. У меня есть представление о таблично-центрированной модели, которая вызывается без каких-либо ограничений и возвращает сотни миллионов строк. Используя встроенный TVF с соответствующей параметризацией, пользователи не могут случайно запросить все строки. Производительность в значительной степени неразличима между двумя.

3 голосов
/ 12 июня 2009

Без разницы. Они оба развернуты / не вложены в содержащий запрос.

Примечание: индексированные представления рассматриваются по-разному, но все же могут быть расширены, а многозначные табличные функции являются черными ящиками для содержащего запрос.

Тони Роджерсон: ВЗГЛЯДЫ - они не дают никаких преимуществ оптимизации; они просто встроенные макросы - используйте экономно

Адам Мачаник: Скалярные функции, вставка и производительность: занимательный заголовок для скучного поста

В связи с этим вопрос SO: Хорошо ли работает оптимизатор плана запросов с объединенными / отфильтрованными табличными функциями?

Страшный DBA (в конце)

Наконец, запись в таблицы не разрешена в функциях

Редактировать, после комментария и понижения Эрика З. Борода ...

Вопрос и ответы (не только мои) не о скалярных udf. «Встроенный» означает «встроенные табличные функции». Совсем разные понятия ...

2 голосов
/ 11 августа 2010

Никто, кажется, не упомянул этот аспект.

Вы не можете иметь Update операторов в встроенной функции, но вы можете написать Update операторов против их так, как если бы они были обновляемым представлением.

2 голосов
/ 12 июня 2009

Обновление: Похоже, я пропустил "встроенную" часть. Тем не менее, я оставляю здесь ответ на тот случай, если кто-то захочет прочитать о разнице между VIEW и обычными функциями.

Если у вас есть только функция, которая выполняет ВЫБОР и выводит данные, то они похожи. Однако даже в этом случае они не совпадают, поскольку VIEW могут быть оптимизированы с помощью движка. Например, если вы запустите SELECT * FROM view1 WHERE x = 10; и у вас есть индекс на поле таблицы, которое отображается на X, тогда он будет использоваться. С другой стороны, функция создает результирующий набор перед поиском, поэтому вам придется перемещать ГДЕ внутри него - однако это не легко, потому что у вас может быть много столбцов, и вы не можете ЗАКАЗАТЬ все из них в одном и том же операторе выбора.

Поэтому, если вы сравниваете представления и функции для одной и той же задачи по предоставлению «представления» над данными, тогда VIEWs - лучший выбор.

НО, функции могут делать гораздо больше. Вы можете выполнять несколько запросов без необходимости объединения таблиц с JOINS или UNION. Вы можете выполнять сложные вычисления с результатами, выполнять дополнительные запросы и выводить данные для пользователя. Функции больше похожи на хранимые процедуры, которые могут возвращать наборы данных, чем на представления.

1 голос
/ 12 июня 2009

Отвечая на ваш вопрос об обновлениях в функции ( msdn ):

Единственные изменения, которые могут быть сделаны операторы в функции изменения в объектах, локальных для функции, такие как локальные курсоры или переменные. Изменения в базе данных таблицы, операции над курсорами, которые не локально для функции, отправка электронная почта, попытка каталога модификация и генерация результата набор, который возвращается пользователю примеры действий, которые не могут быть выполняется в функции.

1 голос
/ 12 июня 2009

Одно большое отличие состоит в том, что функция может принимать параметры, а функция VIEW - нет.

Я склоняюсь к предпочтениям VIEW, поскольку они являются стандартом и поэтому являются переносимой реализацией. Я использую функции, когда эквивалентный VIEW был бы бессмысленным без предложения WHERE.

Например, у меня есть функция, которая запрашивает относительно большую таблицу состояний действительного времени (таблицу 'history'). Если бы это был VIEW, и вы попытались запросить его без предложения WHERE, вы бы получили много достоверных данных (в конце концов!). Использование функции устанавливает контракт, который, если вам нужны данные, вы должны предоставить идентификатор клиента, дата начала и дата окончания и функция, как я устанавливаю этот контакт. Почему не сохраненный процесс? Ну, я ожидаю, что пользователь захочет присоединить набор результатов к дополнительным данным (таблицам, VIEW, функциям и т. Д.), И функция IMO - лучший способ сделать это, а не, скажем, требовать от пользователя записи набора результатов во временную стол.

0 голосов
/ 12 июня 2009

Функция позволяет передавать параметры для создания более конкретного представления. Допустим, вы хотели бы получить клиентов на основе государства. Функция позволила бы вам перейти в состояние, которое вы ищете, и дать вам всех клиентов по этому состоянию. Вид не может этого сделать.

0 голосов
/ 12 июня 2009

Представление - это «представление» данных, возвращаемых запросом, почти псевдотаблица. Функция возвращает значение / таблицу, обычно полученную из запроса данных. Вы можете запустить любой оператор sql в функции при условии, что функция в конечном итоге вернет значение / таблицу.

0 голосов
/ 12 июня 2009

Функция выполняет задачу или множество задач. Представление извлекает данные с помощью запроса. То, что когда-либо вписывается в этот запрос, это то, что вы тоже ограничены. В функции, которую я могу обновлять, выбирать, создавать переменные таблицы, удалять некоторые данные, отправлять электронную почту, взаимодействовать с созданным мной CLR и т. Д. Это намного мощнее, чем просто представление!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...