Яка різниця між збереженою процедурою та поданням?


138

Мене бентежить кілька моментів:

  1. Яка різниця між збереженою процедурою та поданням?

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

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

  4. Який із них найшвидший, і на якій основі один швидший за інший?

  5. Чи переглядають чи зберігають процедури постійно пам'ять?

  6. Що означає, якщо хтось каже, що представлення створюють віртуальну таблицю, а процедури створюють таблицю матеріалів?

Будь ласка, дайте мені знати більше питань, якщо такі є.

Відповіді:


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 ELSE тощо
  • Може вносити зміни до однієї або декількох таблиць
  • НЕ можна використовувати як ціль оператора INSERT, UPDATE або DELETE.

Вид:

  • Є чи НЕ приймати параметри
  • Може використовуватися як будівельний блок для більшого запиту
  • Може містити лише один запит SELECT
  • Може НЕ виконувати зміни в будь-який таблиці
  • Але може (іноді) використовуватись як ціль оператора INSERT, UPDATE або DELETE.

6
Також перегляди не повинні містити жодних пунктів "замовлення за" або "вгору"
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 . Ці стовпці не повинні бути видимими для користувачів, які не мають права переглядати їх. У такому випадку ми можемо створити Перегляд, вибираючи стовпці в таблиці, яка не потребує ніяких дозволів, таких як Ім'я , Вік тощо, без викриття чутливих стовпців (наприклад, Зарплата тощо), про які ми згадували раніше). Тепер ми можемо видалити дозвіл на прямий запит працівника таблиці та просто зберегти дозвіл на читання у Перегляді. Таким чином, ми можемо реалізувати безпеку за допомогою Views.

4
  1. ПЕРЕГЛЯД - це динамічний запит, де можна використовувати клавішу "WHERE"
  2. Збережена процедура - це фіксований вибір даних, який повертає попередньо визначений результат
  3. Ні перегляд, ні збережена процедура не виділяють пам'ять. Лише матеріалізований погляд
  4. ТАБЛИЦЯ - це лише одна ENTITY, представлення даних може збирати дані з різних ENTITIES або TABLES

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

І INSERT, і DELETE працювали в цій справі

Очевидно, що ви не можете оновлювати жодні поля, зведені або обчислені, але будь-який вид, який є просто прямим видом, повинен бути оновлений.

Якщо представлення містить більше однієї таблиці, ви не можете вставити або видалити, але якщо представлення є лише підмножиною однієї таблиці, тоді ви зазвичай можете.


3

Основна відмінність полягає в тому, що коли ви запитуєте перегляд, то його визначення вставляється у ваш запит. Процедура також може дати результати запиту, але вона збирається і настільки швидше. Іншим варіантом є індексовані види ..


1

@Patrick правильно з тим, що він сказав, але щоб відповісти на інші ваші запитання, представлення створить себе в пам'яті, і залежно від типу об'єднань, даних і якщо буде зроблено якесь агрегування, це може бути досить голодним видом перегляду.

Збережені процедури виконують всю їх обробку або за допомогою таблиці Temp Hash, наприклад, # tmpTable1, або в пам'яті за допомогою @ tmpTable1. Залежно від того, що ви хочете сказати.

Збережена процедура - це як функція, але називається безпосередньо її назвою. замість функцій, які фактично використовуються всередині самого запиту.

Очевидно, що більшість часу таблиці пам'яті швидше, якщо ви не отримуєте багато даних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.