Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.Б.Д / лекции / 4БД.doc
Скачиваний:
38
Добавлен:
30.05.2020
Размер:
115.2 Кб
Скачать

2.5 Створення індексу

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

В середовищі SQL Server реалізовано декілька типів індексів:

  • кластерні індекси ;

  • некластерні індекси ;

  • унікальні індекси.

Некластерний індекс

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

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

  • інформацію про ідентифікаційний номер файлу, в якому зберігається рядок ;

  • ідентифікаційний номер сторінки відповідних даних;

  • номер шуканого рядка на відповідній сторінці;

  • вміст стовпця.

В більшості випадків слід обмежуватися 4-5 індексами.

Кластерний індекс

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

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

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

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

При створенні в таблиці первинного ключа (PRIMARY KEY) сервер автоматично створює для нього кластерний індекс, якщо його не існувало раніше або якщо при визначенні ключа не був явно вказаний інший тип індексу.

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

Унікальний індекс

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

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

Унікальні індекси слід визначати тільки тоді, коли це дійсно необхідне. Для забезпечення цілісності даних в стовпці можна визначити обмеження цілісності UNIQUE або PRIMARY KEY, а не вдаватися до унікальних індексів. Їх використовування тільки для забезпечення цілісності даних є невиправданою витратою простору в базі даних. Крім того, на їх підтримку витрачається і процесорний час.

Засоби язика SQL пропонують декілька способів визначення індексу:

  • автоматичне створення індексу при створенні первинного ключа;

  • автоматичне створення індексу при визначенні обмеження цілісності UNIQUE ;

  • створення індексу за допомогою команди CREATE INDEX.

Остання команда має наступний формат:

<створення_індекса>::=

CREATE [ UNIQUE ]

[ CLUSTERED | NONCLUSTERED ]

INDEX ім’я_індекса ON ім’я_таблиці(ім’я_колонки [ASC|DESC][,...n])

[WITH [PAD_INDEX]

[[,] FILLFACTOR=фактор_заповнення]

[[,] IGNORE_DUP_KEY]

[[,] DROP_EXISTING]

[[,] STATISTICS_NORECOMPUTE] ]

[ON ім’я_групи_файлів ]

Розглянемо деякі параметри приведеної команди.

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

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

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

Параметр NONCLUSTERED дозволяє створювати некластерні індекси.

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

Параметр PAD_INDEX визначає заповнення внутрішнього простору індексу і застосовується спільно з FILLFACTOR.

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

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

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

Соседние файлы в папке лекции