Есть ли польза от использования представления TSQL по сравнению с эквивалентной хранимой процедурой? - PullRequest
3 голосов
/ 04 мая 2011

Вдобавок ко всему, я знаю один главный недостаток представления по сравнению с хранимой процедурой.Если хранимая процедура A ссылается на хранимую процедуру B и B изменяется, A будет работать правильно.Но если представление A ссылается на представление B и B изменяется, для корректной работы необходимо обновить A.ИМХО, такое поведение вида просто отстой и открывает двери для всех видов тонких ошибок.

Ну, а как насчет преимуществ?Зачем людям вообще использовать представления, если они просто могут всегда использовать эквивалентные хранимые процедуры с именами с префиксом vw для ясности?

Ответы [ 4 ]

7 голосов
/ 04 мая 2011

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

2 голосов
/ 04 мая 2011

Представления SQL используются для многих других целей.

1) Скройте несколько столбцов из исходных таблиц и создайте представление, предоставляющее разрешения только для представления для определенного набора пользователей.Я предполагаю, что это одно из основных применений представления.

2) Объединить 2 или более таблиц, иметь производный столбец

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

1 голос
/ 04 мая 2011

Если это выбор между «select * from vwMyView» и «exec MyProc ()», разница невелика. Оба будут возвращать набор результатов, который вы можете использовать как хотите. Стоит отметить, что если вы используете представление, его можно объединить с другими таблицами, что может или не может применяться к вашей ситуации.

Если вы хотите / должны фильтровать результирующий набор, вам нужно использовать представление, так как просто добавить предложение where, где с процедурой вам нужно будет передать параметры.

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

Однако "тонкие ошибки", о которых вы упоминаете, могут возникать при любом способе. Если у вас есть представление A, ссылочное представление B, и запрос, который материализует представление B, изменяется (без изменения количества возвращаемых столбцов), все, что зависит от представления A, может сломаться. То же самое относится и к хранимым процессам: если proc B изменяет способ создания своего результирующего набора, proc A может больше не работать правильно.

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

0 голосов
/ 27 января 2016

С моей точки зрения, есть две основные темы:

  1. Кэширует план хранимой процедуры - это будет способствовать выполнению SP, хотя, если представление выполняется часто, его план также будет наличными.

  2. Просмотр может использоваться в JOINs, что не может быть сделано SP.

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