НОУ ІНТУІТ, Лекція, Підвищення продуктивності запиту
Створюємо та застосовуємо кластеризовані індекси
- Запустіть SQL Server Management Studio. Відкрийте вікно New Query (Створити запит) та змініть контекст бази даних на Adventure Works .
- Для створення унікального кластеризованого індексу в таблиці Orders ведіть та виконайте наступну інструкцію. Код цього прикладу є у файлах прикладів під ім'ям Creating And Using Clustered Indexes.sql.

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


Тепер створимо складовий індекс у таблиці OrderDetails. Складовий індекс - це індекс, визначений більш, ніж одного стовпця. Ключі індексу сортуються спочатку по першому ключовому стовпцю індексу, потім по другому і т. д. Такий індекс корисний у тих випадках, коли два або більше стовпця використовуються спільно як аргументи пошуку в запитах або коли унікальність рядка визначена через кілька стовпців.
Створюємо складовий кластеризований індекс
- У SQL Server Management Studio введіть та виконайте такі інструкції, щоб створити складний кластеризований індекс у таблиці OrderDetails .
Некластеризовані індекси
На противагу кластеризованим індексам некластеризовані індекси не містять всіх рядків даних на рівні листових вершин індексу. Замістьцього на рівні листових вершин зберігаються всі ключові стовпці та покажчики на рядки у таблиці. Використання та запис покажчиків залежить від того, чи є базова таблиця купою чи має кластеризований індекс .
- Куча.Якщо таблиця не має кластеризованого індексу , SQL Server зберігає покажчик у фізичному рядку (ідентифікатор файлу, ідентифікатор сторінки та ідентифікатор рядка на сторінці) на рівні листових вершин некластеризованого індексу . Щоб знайти певний рядок у цьому випадку, SQL Server виконує пошук за індексами (метод seek) і переходить за вказівником, щоб витягти рядок.
- Кластеризований індекс.Якщо кластеризований індекс існує, SQL Server зберігає ключі кластеризації індексу рядків як покажчики на рівні листових вершин некластеризованого індексу . Якщо SQL Server повертає рядок засобами некластеризованого індексу , він виконує пошук за некластеризованим індексом , повертає відповідний ключ кластеризації, а потім виконує пошук за кластеризованим індексом, щоб повернути потрібний рядок.
Оскільки некластеризовані індекси повністю не містять рядка даних, для кожної таблиці можна створити до 249 таких індексів. Синтаксис для їх створення багато в чому схожий на синтаксис створення кластеризованих індексів:
Створюємо та застосовуємо некластеризовані індекси
- Запустіть SQL Server Management Studio. Відкрийте вікно New Query (Створити запит) та змініть контекст бази даних на Adventure Works .
- Введіть наступну інструкцію SELECT і натисніть клавішу клавіатури (Ctrl+L), щоб відобразити план виконання. Код цього прикладу є у файлах прикладів під ім'ям Creating And Using Nonclustered Indexes.sql.

Якщо визатримайте вказівник миші над оператором IndexSeek , то побачите, що SQL Server виконує пошук за індексом (метод seek) у таблиці NCLIX_OrderDetails_ProductID , щоб витягти покажчики на потрібні записи. Оскільки в цій таблиці існує кластеризований індекс , SQL Server отримує список ключів кластеризації як покажчиків. Цей список передається на вхід оператора Nested Loops (Вкладені цикли), який є різновидом оператора Join (З'єднання) (з'єднання будуть розглянуті далі у цій лекції). Оператор Nested Loops використовує пошук (метод seek) за кластеризованим індексом, щоб повернути потрібні рядки даних, які потім переходять до оператора Sort (Сортування), щоб виключити повторювані значення в результаті. Так SQL Server витягує рядки за допомогою некластеризованого індексу, якщо існує кластеризований індекс.

Ми бачимо, що в цьому випадку SQL Server використовує оператор RID Lookup, тому що покажчики, які SQL Server отримав в результаті пошуку за індексом (метод seek), є покажчиками на фізичні рядки даних, а не на ключі кластеризації. Оператор RID Lookup - це оператор, який використовується в SQL Server для отримання даних безпосередньо зі сторінки.