3.2. Індексування

Як зазначалося вище, визначення ключа для таблиці означає автоматичне сортування записів, контроль відсутності повторень значень ключових полях записів та підвищення швидкості виконання операцій пошуку в таблиці. Для реалізації цих функцій у СУБД застосовуютьіндексування.

Термін "індекс" тісно пов'язаний з поняттям "ключ", хоча між ними є і деяка відмінність.

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

Варіанти вирішення проблеми організації фізичного доступу до інформації в основному залежать від наступних факторів:

виду вмісту у полі ключа записів індексного файлу;

типу використовуваних посилань (покажчиків) для запису основний таблиці;

способу пошуку корисних записів.

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

На практиці найчастіше використовуютьсядва методи пошуку:послідовний і бінарний (заснований на розподілі інтервалу пошуку навпіл).

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

запису

Мал. 3.3. Однорівнева схема індексації

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

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

Утворення згортки значення ключового поля шуканого запису.

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

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

індексування

Мал. 3.4. Дворівнева схема індексації

У цій схемі індекс основної таблиці розподілено за сукупністю файлів: один файл головного індексу і безліч файлів з блоками ключів.

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

Зв'язок вторинного індексу з елементами бази даних може бути встановлена ​​різними способами. Один зних - використання вторинного індексу як входу для отримання первинного ключа, яким потім з використанням первинного індексу проводиться пошук необхідних записів (рис. 3.5).

таблиці

Мал. 3.5. Спосіб використання вторинних індексів

Деякими СУБД, наприклад Access, розподіл індексів на первинні та вторинні не проводиться. У цьому випадку використовуються автоматично створювані індекси та індекси, що визначаються користувачем по будь-якому з не ключових полів.

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