План запиту
План запиту — упорядкований набір кроків, які використовуються для доступу до даних в системах керування базами даних SQL. Це конкретний випадок концепції реляційних моделей планів доступу. Оскільки мова SQL є декларативною, то зазвичай існує велика кількість альтернативних способів виконання заданого запиту з широким діапазоном продуктивності. Коли запит відправляється в базу даних, оптимізатор запитів оцінює деякі з різних, правильних можливих планів виконання запиту і повертає той, який він вважає найкращим. Оскільки оптимізатори запитів недосконалі, то користувачам і адміністраторам баз даних іноді доводиться вручну перевіряти і налаштовувати плани, створені оптимізатором, для підвищення продуктивності.
Кожна система керування базами даних може запропонувати один або кілька механізмів повернення плану заданого запиту. Деякі пакети містять інструменти, що генерують графічне подання плану запиту. Інші інструменти дозволяють встановити в з'єднанні спеціальний режим, що змушує СКБД повертати текстовий опис плану запиту. Інший механізм отримання плану запиту включає запит до таблиці віртуальної бази даних після виконання запиту, який потрібно досліджувати. В Oracle, наприклад, це може бути досягнуто за допомогою оператора EXPLAIN PLAN
.
Наприклад, інструмент SQL Server Management Studio, який поставляється з Microsoft SQL Server, показує графічний план при виконанні даного двостолового з'єднання зі зразковою базою даних:
SELECT *
FROM HumanResources.Employee AS e
INNER JOIN Person.Contact AS c
ON e.ContactID = c.ContactID
ORDER BY c.LastName
Інтерфейс дозволяє досліджувати різні атрибути операторів, що беруть участь у плані запиту, в тому числі тип оператора, кількість рядків, яке кожен оператор споживає або виробляє, а також очікувану вартість роботи кожного оператора.
Текстовий план вищенаведеного запиту має такий вигляд:
StmtText
----
|--Sort(ORDER BY:([c].[LastName] ASC))
|--Nested Loops(Inner Join, OUTER REFERENCES:([e].[ContactID], [Expr1004]) WITH UNORDERED PREFETCH)
|--Clustered Index Scan(OBJECT:([AdventureWorks].[HumanResources].[Employee].[PK_Employee_EmployeeID] AS [e]))
|--Clustered Index Seek(OBJECT:([AdventureWorks].[Person].[Contact].[PK_Contact_ContactID] AS [c]),
SEEK:([c].[ContactID]=[AdventureWorks].[HumanResources].[Employee].[ContactID] as [e].[ContactID]) ORDERED FORWARD)
Він вказує, що механізм запитів виконає перевірку індексу первинного ключа таблиці Employee
і пошук за індексом первинного ключа (стовпчик ContactID
) таблиці Contact
, щоб знайти рядки зі збігом. Результатні рядки з кожного боку буде показано вкладеному оператору об'єднання вкладених циклів, відсортовано, а потім повернуті як результат, встановлений для з'єднання. Щоб налаштувати запит, користувач повинен розуміти різні оператори, які може використовувати база даних, і ті, які можуть бути ефективнішими за інші, при цьому забезпечуючи семантично правильні результати запиту.
Перегляд плану запиту може надати можливості для створення нових індексів або зміни наявних. Він також може показати, що база даних неправильно використовує наявні індекси.
Оптимізатор запитів не завжди обиратиме найефективніший план даного запиту. В деяких базах даних план запиту можна переглянути, знайти проблеми, а потім оптимізатор запитів дає підказки з його поліпшення. В інших базах даних можна спробувати альтернативи даного запиту (семантично еквівалентні запити, які повертають такі самі результати). Деякі інструменти запитів можуть генерувати вбудовані підказки в запиті для використання оптимізатором. Деякі бази даних на кшталт Oracle надають таблицю планів для налаштування запитів. Така таблиця планів повертає вартість і час виконання запиту. Oracle пропонує два підходи до оптимізації: на основі витрат або правил. Другий підхід повільно застаріває[джерело?]. Для використання оптимізації на основі витрат усі таблиці, що використовуються в запиті, повинні бути проаналізовані. Для цього адміністратор бази даних може запустити код з пакету DBMS_STATS
. Іншими інструментами для оптимізації запитів є: трасування SQL, Oracle Trace та TKPROF.
- Сінх, Хардіп (2009). SQL Performance Tuning with reference to Oracle [Регулювання продуктивності SQL з посиланням на Oracle]. Seeing With C (англійською) . Процитовано 24 травня 2017.
{{cite web}}
: Обслуговування CS1: Сторінки з параметром url-status, але без параметра archive-url (посилання)