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

Я смущен несколькими моментами:

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

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

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

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

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

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

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

10 ответов


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

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

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

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

хранящей Столбцы: .идентификатор пользователя, .имя пользователя, .user_pw

tbl_profile Столбцы: .идентификатор профиля, .идентификатор пользователя .profile_description

так что, если я нахожу себя запрос из этих таблиц много... вместо того, чтобы делать соединение в каждом 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 по идентификатору пользователя... все, что мне нужно is

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-ваш параметр.

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


много информации, доступной в интернете, как этой

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

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

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

Вид:

  • не принимает параметры
  • может использоваться как строительный блок в большем запросе
  • может содержать только один запрос SELECT
  • не может выполнять изменения в любой таблице
  • но может (иногда) использоваться в качестве цели вставки, обновления или инструкция Delete.

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

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


вид-это простой способ сохранить сложную SELECT в базе данных.

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

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

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

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

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

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


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

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

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

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


  1. представление-это динамический запрос, в котором вы можете использовать предложение "WHERE" -
  2. хранимая процедура-это фиксированный выбор данных, который возвращает предопределенный результат
  3. ни представление, ни хранимая процедура не выделяют память. Только материализованный вид
  4. таблица-это только одна сущность, представление может собирать данные из разных сущностей или таблиц

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


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

хранимые процедуры выполняют всю их обработку либо с помощью временной хэш-таблицы e.g #tmpTable1 или в памяти с помощью @tmpTable1. В зависимости от того, что вы хотите ему сказать.

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

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


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

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. Однако иногда вы можете вставить в представление ...

I создал представление в существующей таблице с помощью ...

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

и вставка, и удаление работали в этом случае

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

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


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

  1. представления могут использоваться для скрытия сложности. Представьте себе сценарий, когда 5 человек работают над проектом, но только один из них слишком хорош с базой данных, такой как сложные соединения. В таком случае он может создавать представления, которые могут быть легко запрошены другими членами команды, как они запрашивают любую отдельную таблицу.
  2. безопасность может быть легко реализована с помощью представлений. Предположим, мы стол сотрудник, который содержит чувствительные колонки, как зарплата, номер SSN. Эти столбцы не должны быть видны пользователям, которые не авторизованы для их просмотра. В таком случае мы можем создать представление, выбрав столбцы в таблице, которая не требует авторизации, например имя, возраст etc, без подвергать чувствительные колонки действию (как зарплата etc. мы уже упоминали ранее). Теперь мы можем удалить разрешение на прямой запрос в таблице сотрудник и просто сохранить разрешение на чтение в представлении. Таким образом, мы можем реализовать безопасность с помощью представлений.