Различие между подставляемой функцией и представлением

Я бы сделал это так:

<% @array.limit(10).each do |a| %>
5
задан Nick 12 June 2009 в 18:51
поделиться

8 ответов

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

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

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

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

16
ответ дан 18 December 2019 в 06:36
поделиться

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

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

Тони Роджерсон: ВИДЫ - они не предлагать преимуществ оптимизации; они просто встроенные макросы - используйте с осторожностью

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

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

Страшный администратор базы данных (в конце)

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

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

Вопрос и ответы (не только мой ) не о скалярных udfs. «Встроенный» означает «

3
ответ дан 18 December 2019 в 06:36
поделиться

Обновление: Похоже, я пропустил «встроенную» часть. Однако я оставляю здесь ответ на тот случай, если кто-то захочет прочитать о различиях между ВИДАМИ и обычными функциями.

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

Следовательно, если вы сравниваете представления и функции для одного и того же задача дать «представление» о данных, тогда ВИДЫ - лучший выбор.

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

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

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

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

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

2
ответ дан 18 December 2019 в 06:36
поделиться

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

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

1
ответ дан 18 December 2019 в 06:36
поделиться

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

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

Например, у меня есть функция, которая запрашивает относительно большую таблицу состояний действительного времени (таблица «история»). Если бы это был ПРОСМОТР, и вы попытались бы запросить его без предложения WHERE, вы бы получили много достоверных данных (в конечном итоге!). Использование функции устанавливает контракт, который, если вам нужны данные, вы должны предоставить идентификатор клиента, дата начала и дата окончания, и функция заключается в том, как я устанавливаю этот контакт. Почему не хранимая процедура? Что ж, я ожидаю, что пользователь захочет ПРИСОЕДИНЯТЬСЯ к набору результатов с дополнительными данными (таблицами, представлениями, функциями,

1
ответ дан 18 December 2019 в 06:36
поделиться

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

0
ответ дан 18 December 2019 в 06:36
поделиться

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

0
ответ дан 18 December 2019 в 06:36
поделиться

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

-1
ответ дан 18 December 2019 в 06:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: