В чем разница между хранимой процедурой и представлением? - PullRequest
107 голосов
/ 04 марта 2011

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

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

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

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

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

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

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

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

Ответы [ 10 ]

111 голосов
/ 04 марта 2011

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

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

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

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

tbl_user Колонки: .Идентификатор пользователя, .user_name, .user_pw

tbl_profile Колонки: .profile_id, .Идентификатор пользователя .profile_description

Так что, если я обнаружу, что запрашиваю из этих таблиц ALOT ... вместо того, чтобы делать соединение в КАЖДОМ peice из 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 по идентификатору пользователя ... все, что мне нужно сделать, это

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

и я получу описание для идентификатора пользователя 25. где 25 - ваш параметр.

Очевидно, что ОЧЕНЬ больше деталей, но это только основная идея.

76 голосов
/ 04 марта 2011

Множество информации доступно в сети, как this

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

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

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

A Вид:

  • НЕ принимает параметры
  • может использоваться как строительный блок в большем запросе
  • может содержать только один запрос SELECT
  • НЕ МОЖЕТ выполнять модификации для любой таблицы
  • , но может (иногда) использоваться в качестве цели INSERT, UPDATE или УДАЛИТЬ утверждение.
9 голосов
/ 04 марта 2011

Для начала нужно понять, что это разные вещи.Хранимые процедуры лучше всего использовать для операторов INSERT-UPDATE-DELETE.и представления используются для операторов SELECT.и вы должны использовать оба.

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

5 голосов
/ 04 марта 2011

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

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

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

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

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

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

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

5 голосов
/ 04 марта 2011

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

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

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

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

3 голосов
/ 04 марта 2011

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

3 голосов
/ 04 марта 2011
  1. VIEW - это динамический запрос, в котором вы можете использовать WHERE -Clause
  2. Хранимая процедура - это фиксированный выбор данных, который возвращает предопределенный результат
  3. Ни представление, ни хранимая процедура не выделяют память. Только материализованное представление
  4. ТАБЛИЦА - это всего лишь одно СУЩЕСТВО, представление может собирать данные из разных СУЩЕСТВ или СТОЛОВ
2 голосов
/ 13 января 2017

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

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]

THEN

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

и

DELETE from Junk Where ID>4

В этом случае сработали как INSERT, так и DELETE.

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

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

1 голос
/ 11 мая 2017

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

  1. Представления могут использоваться для скрытия сложности.Представьте себе сценарий, когда над проектом работают 5 человек, но только один из них слишком хорош в таких вещах базы данных, как сложные объединения.В таком сценарии он может создавать представления, которые могут быть легко запрошены другими членами команды, когда они запрашивают любую отдельную таблицу.
  2. Безопасность может быть легко реализована представлениями.Предположим, у нас есть Таблица Сотрудник , которая содержит чувствительные столбцы, такие как Зарплата , Номер SSN .Предполагается, что эти столбцы не будут видны пользователям, которые не авторизованы для их просмотра.В таком случае мы можем создать представление, выбирающее столбцы в таблице, для которого не требуется авторизация, например Имя , Возраст и т. Д., Без предоставления чувствительных столбцов (таких как Зарплата и т. Д.).упоминалось ранее).Теперь мы можем удалить разрешение на прямой запрос к таблице Employee и просто оставить разрешение на чтение в представлении.Таким образом, мы можем реализовать безопасность с помощью Views.
1 голос
/ 04 марта 2011

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

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

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

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

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