Хранимые процедуры против Просмотры - PullRequest
63 голосов
/ 23 сентября 2010

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

Итак, учитывая производительность и другие аспекты, когда и почему я должен предпочесть один другому?

Ответы [ 7 ]

35 голосов
/ 23 сентября 2010

Ну, я бы лучше использовал хранимую процедуру для инкапсуляции кода и контроля прав доступа.

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

Говоря об этом, представления - это инструмент, который занимает свое место (например, индексированные представления), например хранимые процессы.

19 голосов
/ 23 сентября 2010

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

13 голосов
/ 23 сентября 2010

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

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

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

Представьте, что представления больше похожи на таблицы, чем на хранимые процедуры.

12 голосов
/ 23 сентября 2010

Основным преимуществом хранимых процедур является то, что они позволяют вам включать логику (скриптинг). Эта логика может быть такой простой, как IF / ELSE или более сложной, такой как циклы DO WHILE, SWITCH / CASE.

5 голосов
/ 23 сентября 2010

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

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

4 голосов
/ 23 сентября 2010

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

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

0 голосов
/ 18 августа 2013

Два обоснования.

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

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

...