Чи перегляд швидше, ніж простий запит?


359

Це

select *  from myView

швидше, ніж сам запит для створення представлення даних (для того, щоб мати той самий результатSet):

select * from ([query to create same resultSet as myView])

?

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


7
Я не впевнений в одному перегляді, але вкладені погляди - це загальна ефективність роботи.
Муфлікс

Відповіді:


680

Так , представленням даних може бути призначений кластерний індекс, і коли вони будуть, вони зберігатимуть тимчасові результати, які можуть пришвидшити отримані запити.

Оновлення: Щонайменше троє людей проголосували за мене. З усією повагою я вважаю, що вони просто помиляються; З власної документації Microsoft чітко видно, що Views може підвищити продуктивність.

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

Дозвольте мені перейти безпосередньо до документації:

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

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

Знову ж таки, документація:

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

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

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

Скажімо, що ми є програмною компанією в невеликій країні; Я буду використовувати приклад Литву. Ми продаємо програмне забезпечення по всьому світу і зберігаємо свої записи в базі даних SQL Server. Ми дуже успішні, тому за кілька років ми маємо 1 000 000 записів. Однак нам часто потрібно повідомляти про продажі для цілей оподаткування, і ми виявляємо, що ми продали лише 100 копій програмного забезпечення в нашій країні. Створюючи індексований вигляд лише записів Литви, ми отримуємо необхідні записи, які нам потрібні, в індексованому кеші, як описано в документації на MS. Коли ми запускаємо наші звіти про продаж литовців у 2008 році, наш запит буде шукати індекс глибиною всього 7 (Log2 (100) з деякими невикористаними листям). Якби ми зробили те ж саме без VIEW і просто покладаючись на індекс в таблицю, нам довелося б перейти дерево індексу з глибиною пошуку 21!

Зрозуміло, що саме Перегляд забезпечив би нам перевагу у виконанні (3 рази) порівняно з простим використанням індексу. Я намагався використовувати приклад у реальному світі, але ви зауважите, що простий список продажів у Литві дав би нам ще більшу перевагу.

Зауважте, що я просто використовую пряме b-дерево для свого прикладу. Хоча я досить впевнений, що SQL Server використовує якийсь варіант b-дерева, я не знаю деталей. Тим не менш, справа має місце.

Оновлення 3: Постало питання про те, чи індексований вид просто використовує індекс, розміщений у нижній таблиці. Тобто, перефразовуючи: "індексований вигляд є лише еквівалентом стандартного індексу, і він не пропонує нічого нового або унікального для представлення". Якби це було правдою, звичайно, тоді наведений аналіз був би невірним! Дозвольте навести цитату з документації Microsoft, яка демонструє, чому я вважаю, що ця критика не є дійсною чи правдою:

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

Разом з вищенаведеною цитатою щодо збереження даних у фізичному зберіганні та іншою інформацією в документації про те, як створюються індекси для Views, я думаю, що можна з упевненістю сказати, що індексований вигляд - це не просто кешований SQL Select, який трапляється для використання індекс, визначений у головній таблиці. Таким чином, я продовжую відстоювати цю відповідь.


29
Так, індексовані представлення можуть значно підвищити ефективність. Але індексовані погляди - це не просто "види", а загалом кажучи, звичайний "перегляд" не швидший, ніж пов'язані з ними запити.
BradC

10
@Charles - не має значення, чи це індекс, того, що представлення може використовувати індекс, а
непростий

196
/ аплодують @Mark за те, що він стоїть на місці і раціонально аргументує це
annakata

17
О, чоловіче, я набрав 8 голосів на цьому! Я вражений, що люди так швидко зволікають, не маючи хоч відваги Чарльза аргументувати свою думку.
Марк Бріттінгем

8
Оскільки в таблиці може бути лише один індекс clusterdee, і ви МОЖЕТЕ створити окремий кластерний індекс для перегляду, (оскільки поля в кластерному індексі незалежно зберігаються на сторінках індексів), це є обманом (work-arounnd?), Що дозволяє отримати два кластерних індекси на одній таблиці.
Чарльз Бретана

51

Взагалі кажучи, ні. Перегляди в основному використовуються для зручності та безпеки, і не дають (самі по собі) переваги швидкості.

Зважаючи на це, у SQL Server 2000 і вище є функція під назвою " Проіндексовані види", яка може значно покращити продуктивність, маючи кілька застережень:

  1. Не кожен перегляд можна перетворити на індексований вигляд; вони повинні слідувати певним набором керівних принципів , які (поряд з іншими обмеженнями) означає , що ви не можете включати в себе загальні елементи запиту , такі як COUNT, MIN, MAXабо TOP.
  2. Індексовані представлення використовують фізичний простір у базі даних, як і індекси на таблиці.

У цій статті описані додаткові переваги та обмеження індексованих переглядів :

Ти можеш…

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

Ви не можете…

  • Визначення представлення не може посилатися на інші представлення даних або таблиці в інших базах даних.
  • Він не може містити COUNT, MIN, MAX, TOP, зовнішніх з'єднань або декількох інших ключових слів або елементів.
  • Ви не можете змінювати основні таблиці та стовпці. Представлення створюється за допомогою параметра "СХЕМАБІНДИНГ".
  • Ви не завжди можете передбачити, що робитиме оптимізатор запитів. Якщо ви використовуєте Enterprise Edition, він автоматично розгляне унікальний кластерний індекс як варіант запиту, але якщо він знайде "кращий" індекс, він буде використаний. Ви можете змусити оптимізатора використовувати індекс через підказку NOT NOXPAND - але будьте обережні, використовуючи будь-який підказку.

3
повністю не згоден ... читання з виду дозволяє переписати SQL .. і зазвичай швидше читати з виду (ніж з дампа перегляду).
Аарон Кемпф

@AaronKempf, я хотів би побачити посилання на це, це не було моїм досвідом. Коли я шукаю "переглянути переписаний SQL", усі результати, які я отримую, відносяться до Oracle, а не до сервера SQL, наприклад docs.oracle.com/cd/E14072_01/server.112/e10810/qrbasic.htm
BradC

Я вчора лише робив тестування на це, я був приголомшений .. в основному, якщо я знімаю дамп із виду (в таблицю), будь-який запит, який я запускаю, є СЛІЗНИМ .. тому що більшість запитів проходять через подання, як масло і переписуються за допомогою оптимізатора запитів .. Принаймні, це я припускаю. Я спробую найближчим часом написати запис про це в блозі, бенчмаркінг був досить захоплюючим. У основному, перегляди допомагають надзвичайно ефективно.
Аарон Кемпф

@AaronKempf Не впевнений, що це навіть той самий сценарій, що і вихідний питання (який стосується запиту проти того, щоб цей ідентичний запит переглядати). У будь-якому випадку, я не бачу, як матеріалізація подання до таблиці зробить його ПОЛІЗНИМ (саме це робить індексований вигляд), якщо тільки ваша нова таблиця не має хороших індексів.
BradC

1
Бред; Я написав по-справжньому погану публікацію в блозі про те, як погляди врятують мене 99% моєї роботи в цій ситуації. Я планую написати пару інших статей, але я знаю, що мені потрібно вписати ТОН детальніше в цьому. Ви проти заглянути і сказати мені, що ви думаєте про мій опис? Я знаю, що це не матиме більше сенсу (поки я не отримаю ще 2-3 статті) .. але я шалено закохана в погляди, і я вже давно! accessadp.com/2013/01/22/do-views-increase-performance
Аарон Кемпф

14

Принаймні, у SQL Server плани запитів зберігаються в кеші планів як для представлень, так і для звичайних запитів SQL на основі параметрів запиту / перегляду. Для обох вони скидаються з кешу, коли вони не були використані протягом досить тривалого періоду і потрібне місце для деяких інших щойно поданих запитів. Після цього, якщо видається той самий запит, він перекомпілюється і план повертається назад у кеш. Так що ні, різниці немає, враховуючи, що ви повторно використовуєте той самий SQL-запит і той самий вигляд з однаковою частотою.

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


14

EDIT: Я помилявся, і ви повинні побачити відповідь Маркса вище.

Я не можу говорити з досвіду роботи з SQL Server , але для більшості баз даних відповідь була б ні. Єдина потенційна вигода, яку ви отримуєте, з розуму продуктивності, від використання представлення даних, - це те, що вона може створити деякі шляхи доступу на основі запиту. Але головна причина використання представлення даних - спрощення запиту або стандартизація способу доступу до деяких даних у таблиці. Взагалі кажучи, ви не отримаєте переваги від ефективності. Я, можливо, помиляюся.

Я б придумав помірно складніший приклад і встигнути це побачити самостійно.


1
Ще одна причина поглядів - допомогти контролю доступу в моделях на основі ролей
annakata

1
Ви помиляєтесь щодо покращення продуктивності. Я не пояснив достатньо, щоб переконати деяких людей у ​​своєму первісному коментарі, але MS має чітку документацію щодо використання поглядів для підвищення продуктивності. Дивіться мою (зараз сильно прихильну) відповідь нижче.
Марк Бріттінгем

7

Це може бути швидше, якщо ви створите матеріалізований вигляд ( із прив'язкою схеми ). Нематеріалізовані представлення виконуються так само, як звичайний запит.


прив'язка схеми має мало спільного з продуктивністю, вона прив'язує схему подання до нижньої таблиці, тому вона залишається синхронізованою і є попередньою умовою для індексованих подань.
Сем Шафран

5

Я розумію, що деякий час назад перегляд буде швидшим, тому що SQL Server може зберігати план виконання, а потім просто використовувати його, а не намагатися розібратися на ходу. Я думаю, що на сьогоднішній день підвищення продуктивності, мабуть, не настільки велике, як раніше, але я маю здогадуватися, що для перегляду буде певне покращення.


Це було моє розуміння: звикли до матерії, чи не більше
annakata

Не з точки зору продуктивності - є засобом обмеження доступу. Але це була б інша тема. ;)
AnonJr

о, звичайно, багато вагомих причин використовувати перегляди, а не один, щоб використовувати необроблені запити: P
annakata

4

Однозначно, перегляд краще, ніж вкладений запит для SQL Server. Не знаючи точно, чому це краще (доки я не прочитав пост Марка Бріттінгема), я провів кілька тестів і зазнав майже шокуючого поліпшення продуктивності при використанні представлення та вкладеного запиту. Після запуску кожної версії запиту кілька сотень поспіль версія перегляду запиту завершується за половину часу. Я б сказав, що це мені достатньо доказів.


Дякую Йордано ... рада почути, що вся ця теорія працює в реальному світі.
Марк Бріттінгем

Я маю досвід роботи з вкладеним видом (view in view), і було дуже погано. Коли всі перегляди були переписані на підбірки, продуктивність була в багато разів швидшою, тому, можливо, є місце для серйозних тестів.
Муфлікс

2

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


Якщо представлення - це невеликий набір полів, і ці поля потім покриваються індексом, чи достатньо розумний SQL Server, щоб використовувати цей індекс, що охоплює, під час виконання другої форми запиту?
AnthonyWJones

1

Все залежить від ситуації. Індексовані представлення MS SQL швидші, ніж звичайні подання або запити, але індексовані представлення не можна використовувати в дзеркальному оточенні бази даних (MS SQL).

Перегляд у будь-якому виді циклу спричинить серйозне уповільнення, оскільки представлення повторно заселяється кожного разу, коли воно викликається у циклі. Те саме, що запит. У цій ситуації тимчасова таблиця, що використовує # або @ для утримання ваших даних, щоб пройти цикл, швидша, ніж перегляд або запит.

Тож все залежить від ситуації.


0

Немає практичних відмінностей, і якщо ви прочитаєте BOL, ви побачите, що коли-небудь ваш звичайний старий SQL SELECT * FROM X все-таки скористається кешуванням плану тощо.


0

Слід зберегти план виконання, але це буде незначно, але це буде незначно.


0

Мета перегляду - використовувати запит знову і знову. З цією метою SQL Server, Oracle та ін. Зазвичай забезпечують "кешовану" або "скомпільовану" версію вашого перегляду, тим самим покращуючи його продуктивність. Взагалі це має бути краще, ніж "простий" запит, хоча якщо запит справді дуже простий, переваги можуть бути незначними.

Тепер, якщо ви робите складний запит, створіть подання.


0

На мій погляд, використання перегляду трохи швидше, ніж звичайний запит. Моя збережена процедура займала близько 25 хвилин (робота з різними більшими наборами записів і декілька приєднань), і після використання перегляду (некластеризованого) продуктивність була лише трохи швидшою, але зовсім не суттєвою. Мені довелося скористатися деякими іншими методами / методом оптимізації запитів, щоб зробити це різко змінити.


Як ми пишемо / розробляємо запит, дуже важливо.
kta

Я виявив використання CTE для обмеження повернення даних із таблиці, а потім виконання всіх робіт / приєднань тощо тощо від CTE значно покращив ефективність у багатьох випадках
MattE

0

Вибір із представлення даних або з таблиці не матиме занадто великого сенсу.

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

Ви навіть можете створити покажчик переглядів для швидшого пошуку вимог. http://technet.microsoft.com/en-us/library/cc917715.aspx

Але якщо ви шукаєте як "% ...%", ніж двигун sql не отримає користі від індексу на текстовому стовпці. Якщо ви можете змусити своїх користувачів здійснювати пошуки на зразок "...%", це буде швидким

для відповіді на форумах asp: https://forums.asp.net/t/1697933.aspx?Which+is+faster+when+using+SELECT+query+VIEW+or+Table+


0

Незважаючи на всі сподівання, погляди в деяких умовах повільніші.

Я виявив це нещодавно, коли у мене виникли проблеми з даними, витягнутими з Oracle, які потрібно було перекласти в інший формат. Можливо, 20k рядків джерела. Невеликий столик. Для цього ми імпортували дані oracle так само, як я міг змінити, у таблицю, а потім використовували подання для вилучення даних. На основі цих поглядів у нас були вторинні погляди. Можливо 3-4 рівні переглядів.

Один із заключних запитів, який витягнув, можливо, 200 рядків зайняв би 45 хвилин! Цей запит базувався на каскаді поглядів. Можливо, 3-4 рівні глибокі.

Я міг би взяти кожне з питань, про які йдеться, вставити його sql в один вкладений запит і виконати його за пару секунд.

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

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

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


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