В чем разница между хранимой процедурой и представлением?

138

Я запутался в нескольких моментах:

  1. В чем разница между хранимой процедурой и представлением?

  2. Когда я должен использовать хранимые процедуры и когда я должен использовать представления в SQL Server?

  3. Позволяют ли представления создавать динамические запросы, где мы можем передавать параметры?

  4. Какой из них самый быстрый, и на каком основании один быстрее другого?

  5. Виды или хранимые процедуры выделяют память постоянно?

  6. Что это значит, если кто-то говорит, что представления создают виртуальную таблицу, а процедуры создают таблицу материалов?

Пожалуйста, дайте мне знать больше очков, если таковые имеются.

NoviceToDotNet
источник

Ответы:

144

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

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

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

Скажем, у меня есть две таблицы:

  • tbl_userС колоннами: user_id, user_name,user_pw
  • tbl_profileС колоннами: profile_id, user_id,profile_description

Поэтому, если я обнаружу, что запрашиваю из этих таблиц МНОГО ... вместо того, чтобы выполнять соединение в КАЖДОМ куске SQL, я бы определил представление как:

CREATE VIEW vw_user_profile
AS
  SELECT A.user_id, B.profile_description
  FROM tbl_user A LEFT JOIN tbl_profile B ON A.user_id = b.user_id
GO

Таким образом, если я хочу , чтобы запрос profile_descriptionна user_idв будущем, все , что нужно сделать , это:

SELECT profile_description FROM vw_user_profile WHERE user_id = @ID

Этот код можно использовать в хранимой процедуре, например:

CREATE PROCEDURE dbo.getDesc
    @ID int
AS
BEGIN
    SELECT profile_description FROM vw_user_profile WHERE user_id = @ID
END
GO

Итак, позже я могу позвонить:

dbo.getDesc 25

и я получу описание для user_id25, где 25ваш параметр.

Очевидно, здесь гораздо больше деталей, это только основная идея.

Патрик
источник
1
Но я могу присоединиться, могу объединить несколько таблиц в хранимой процедуре, где мне не нужно указывать параметр.
NoviceToDotNet
5
но ПОЧЕМУ ты это сделал? Что вы пытаетесь достичь? Вы можете использовать представление КАК таблицу ... хранимые процедуры предназначены для ДЕЙСТВИЯ ... представления предназначены для облегчения вашей жизни.
Патрик
1
Думайте о представлении как о сохраненном запросе, поэтому, если у вас есть две таблицы, которые, как вам кажется, нужно объединить, чтобы выполнить работу, вы можете создать представление, с которым будете работать, чтобы вам не приходилось объединять их все время.
Патрик
2
Я не получаю, пожалуйста, сделайте немного больше описания.
NoviceToDotNet
2
Правильно, но тогда он хранит ваш взгляд ... так что вы можете назвать его как одну таблицу. таким образом, вы создаете свое объединение один раз, и любое будущее использует ссылку непосредственно на представление, которое вызывает базовый sql, как если бы он был таблицей.
Патрик
107

Много информации доступно здесь

Вот хорошее резюме:

Хранимая процедура:

  • Принимает параметры
  • Можно НЕ использовать в качестве строительного блока в большем запросе
  • Может содержать несколько операторов, циклов IF IFSE и т. Д.
  • Может выполнять модификации одной или нескольких таблиц
  • НЕ может использоваться в качестве цели оператора INSERT, UPDATE или DELETE.

Вид:

  • Есть ли НЕ принимать параметры
  • Может использоваться как строительный блок в большем запросе
  • Может содержать только один запрос SELECT
  • Может НЕ выполнять изменения в любой таблицы
  • Но может (иногда) использоваться в качестве цели оператора INSERT, UPDATE или DELETE.
cusimar9
источник
6
Кроме того, представления не должны содержать какие-либо пункты "order by" или "top"
sksallaj
2
Что означает «НЕ может использоваться в качестве цели оператора INSERT, UPDATE или DELETE»? Разве мы не можем использовать INSERT, DELETE, UPDATE в хранимых процедурах?
Арсман Ахмад
«Вид, НЕ принимает параметры», это не правда? Видео для примера: youtube.com/watch?v=zK-mWjUxKpw
xayer
Представления могут выполнять модификации базовой таблицы / таблицы: csharp-video-tutorials.blogspot.com/2012/09/...
Khurram
8

Для начала нужно понять, что это разные вещи. Stored Proceduresлучше всего использовать для INSERT-UPDATE-DELETEзаявлений. Принимая во внимание Views, что используются для SELECTзаявлений. Вы должны использовать их обоих.

В представлениях вы не можете изменить данные. Некоторые базы данных имеют обновляемые представления, которые можно использовать INSERT-UPDATE-DELETEв Views.

Махеш
источник
2
Вы можете изменить данные в базовой таблице с помощью Views. Представления обновляются.
Dot Net разработчик
7

Представление SQL - это виртуальная таблица, основанная на запросе SQL SELECT. Представление ссылается на одну или несколько существующих таблиц базы данных или другие представления. Это моментальный снимок базы данных, в то время как хранимая процедура представляет собой группу операторов Transact-SQL, скомпилированных в единый план выполнения.

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

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

Проверьте эту статью: Просмотр против хранимых процедур . Именно то, что вы ищете

Реджи
источник
5

Представление - это простой способ сохранить комплекс SELECTв базе данных.

Процедура хранения используется, когда простого SQL просто недостаточно. Процедуры хранения содержат переменные, циклы и вызовы других хранимых процедур. Это язык программирования, а не язык запросов.

  1. Взгляды статичны. Думайте о них как о новых таблицах с определенной разметкой, и данные в них создаются на лету с использованием созданного вами запроса. Как и в любой таблице SQL, вы можете сортировать и фильтровать ее с помощью WHERE, GROUP BYи ORDER BY.

  2. Зависит от того, что вы делаете.

  3. Зависит от базы данных. Простые представления просто запускают запрос и фильтруют результат. Но базы данных, такие как Oracle, позволяют создавать «материализованное» представление, которое в основном представляет собой таблицу, которая обновляется автоматически при изменении базовых данных представления.

    Материализованное представление позволяет вам создавать индексы для столбцов представления (особенно для вычисляемых столбцов, которых нет нигде в базе данных).

  4. Я не понимаю о чем ты говоришь.

Аарон Дигулла
источник
5

В дополнение к вышеприведенным комментариям я хотел бы добавить несколько моментов о представлениях.

  1. Представления могут быть использованы, чтобы скрыть сложность. Представьте себе сценарий, когда над проектом работают 5 человек, но только один из них слишком хорош в таких вещах базы данных, как сложные объединения. В таком сценарии он может создавать представления, которые могут быть легко запрошены другими членами команды, когда они запрашивают любую отдельную таблицу.
  2. Безопасность может быть легко реализована с помощью Views. Предположим, что мы сотрудник таблицы, который содержит чувствительные столбцы, такие как зарплата , номер SSN . Эти столбцы не должны быть видимыми для пользователей, которые не имеют прав для их просмотра. В таком случае мы можем создать представление, выбирающее столбцы в таблице, для которого не требуются никакие полномочия, такие как имя , возраст и т. Д., Без выделения чувствительных столбцов (таких как зарплата и т. Д., О которых мы упоминали ранее). Теперь мы можем удалить разрешение на прямой запрос к таблице Employee и просто оставить разрешение на чтение в представлении. Таким образом, мы можем реализовать безопасность с помощью Views.
Аджендра Прасад
источник
4
  1. VIEW - это динамический запрос, в котором вы можете использовать клаузулу "WHERE".
  2. Хранимая процедура - это фиксированный выбор данных, который возвращает предопределенный результат
  3. Ни представление, ни хранимая процедура не выделяют память. Только материализованный взгляд
  4. TABLE - это всего лишь один объект, представление может собирать данные из различных объектов или таблиц.
swissben
источник
4

Махеш не совсем прав, когда говорит, что вы не можете изменять данные в представлении. Так что с точки зрения Патрика

CREATE View vw_user_profile AS 
Select A.user_id, B.profile_description
FROM tbl_user A left join tbl_profile B on A.user_id = b.user_id

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

Update vw_user_profile Set profile_description='Manager' where user_id=4

или

Update tbl_profile Set profile_description='Manager' where user_id=4

Вы не можете вставить это представление, так как не все поля во всей таблице присутствуют, и я предполагаю, что PROFILE_ID является первичным ключом и не может быть NULL. Однако иногда вы можете ВСТАВИТЬ в вид ...

Я создал вид на существующую таблицу, используя ...

Create View Junk as SELECT * from [TableName]

ЗАТЕМ

Insert into junk (Code,name) values 
('glyn','Glyn Roberts'),
('Mary','Maryann Roberts')

и

DELETE from Junk Where ID>4

И ВСТАВКА и УДАЛЕНИЕ работали в этом случае

Очевидно, что вы не можете обновить какие-либо поля, которые агрегированы или вычислены, но любой вид, который является просто прямым, должен быть обновляемым.

Если представление содержит более одной таблицы, вы не можете вставить или удалить ее, но если представление является подмножеством только одной таблицы, то обычно это можно сделать.

Глин Робертс
источник
3

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

RSC
источник
1

@Patrick верен тому, что он сказал, но чтобы ответить на ваши другие вопросы, View создаст себя в памяти, и в зависимости от типа объединений, данных и, если будет выполнено какое-либо агрегирование, это может быть довольно жадное до памяти представление.

Хранимые процедуры выполняют всю свою обработку либо с использованием Temp Hash Table, например # tmpTable1, либо в памяти, используя @ tmpTable1. В зависимости от того, что вы хотите сказать, чтобы это сделать.

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

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

Робби Тэппинг
источник