Хешування
Хешування (Hashing) - алгоритмічне перетворення значень деякого поля записів (первинного ключа або будь-якого іншого поля) в адреси їх розміщення на зовнішньому носії.
При введенні даних СУБД обчислює адресу сторінки, на якій буде зберігатися запис, і заносить запис на цю сторінку. При виконанні запитів реалізуються аналогічні розрахунки адреси сторінки з подальшим читанням записів з цієї сторінки. Перевагою такого методу є швидкий прямий доступ до даних. При цьому час доступу практично не залежить від кількості збережених записів.
Розглянемо технологію хешування на прикладі даних, наведених у табл. 3.1.
Використовуємо для обчислення адрес сторінок значення даних у полі первинного ключа таблиці Номер накладної: 18, 28, 37, 54, 60, 74, 80. Припустимо, що на кожній сторінці зовнішньої пам'яті можна розмістити тільки один запис.
Номери накладних являють собою цілі двозначні числа. Тому якщо використовувати номери накладних в якості адрес сторінок, для організації зберігання інформації потрібно 99 сторінок з адресами від 01 до 99. Очевидно, що це нераціонально, так як записів у вихідній таблиці всього сім і абсолютна більшість сторінок залишаться порожніми (приводяться міркування будуть більш переконливими, якщо значення даних, що використовуються для хешування, п'ятизначні або шестизначні числа).
За зазначеної причини адреси сторінок обчислюються за допомогою спеціальної хеш-функції. Використовуємо в якості адрес сторінок залишок від ділення кожного значення номера накладної на просте натуральне число (наприклад, 11), зване згорткою ключа (зазвичай хеш-функції мають більш складний вид) (табл. 3.6):
Таблица 3.6 Сведения о поставках товаров в магазин
Номер накладной |
Название товара |
Артикул |
Количество |
Дата поставки |
Адрес (номер страницы) |
37 |
Костюм |
500 |
50 |
10.12.05 |
4 |
54 |
Сапоги |
200 |
75 |
10.12.05 |
10 |
18 |
Туфли |
100 |
120 |
11.12.05 |
7 |
60 |
Костюм |
500 |
35 |
11.12.05 |
5 |
28 |
Костюм |
300 |
20 |
12.12.05 |
6 |
74 |
Костюм |
400 |
50 |
12.12.05 |
8 |
80 |
Туфли |
100 |
100 |
12.12.05 |
3 |
За допомогою виконаного хешування записи розміщуються на семи сторінках зовнішньої пам'яті з адресами від 00 до 10.
Розглянутий приклад ілюструє і недоліки хешування:
1. Сторінки із записами у зовнішній пам'яті можуть розташовуватися нерівномірно, з різною кількістю порожніх сторінок між ними.
2. Можливо збіг розрахованих адрес сторінок для двох або кількох записів (наприклад адреси, обчислені для номерів накладних 18, 29, 40, будуть дорівнюють одному числу - семи). Збіг обчислених адрес називається колізією, значення даних, для яких отримані однакові адреси - синонімами.
Існує багато стратегій розв'язання колізій, але основні з них дві: а) з областю переповнення; б) вільного заміщення.
Стратегія розв'язання колізій за допомогою області переповнення
Область зберігання розбивається на дві частини: основну область і область переповнення (рис. 6).
При введенні в базу даних нового запису обчислюється значення хеш-функції, яке використовується для визначення місця розташування сторінки в основній області пам'яті. Наприклад, якщо номер накладної дорівнює 12, запис буде розміщена на сторінці з адресою 1 (див. позначення курсивом на рис. 6).
Коли сторінка з отриманим адресою зайнята і виникає колізія, новий запис заноситься на перше вільне місце в області переповнення. Наприклад, запис з номером накладної 29, отже, значенням хеш-функції, рівний 7, буде розміщена за адресою 500. У записі-синонімі, який знаходиться в основній області, робиться посилання на адресу запису, що розміщується в області переповнення. У ситуаціях повторення колізій (номер накладної дорівнює 40, значення хеш-функції - 7) знову вводиться запис і поміщається на вільне місце в області переповнення (наприклад, якщо сторінка з номером 501 зайнята, за адресою 502). Вона стає другою в ланцюжку синонімів (цим забезпечується скорочення часу на розміщення нових записів) за допомогою зміни посилань на адреси синонімів (див. рис. 6).
При пошуку потрібного запису обчислюється значення її хеш-функції, що вказує на адресу сторінки в основній пам'яті. Якщо цей запис не є шуканим, послідовно проглядається ланцюжок синонімів до отримання необхідного результату. Очевидно, що швидкість пошуку істотно залежить від довжини ланцюжка синонімів. Вважається, що в ланцюжку не повинно бути більше 10 синонімів [4].
При видаленні запису в основній області пам'яті на її місце переміщається другий запис в ланцюжку синонімів, при цьому всі посилання на синоніми в ланцюжку зберігаються. Якщо видаляється запис в області переповнення, змінюється адресу посилання на наступний синонім у запису, що передує видаленому запису.
Основная область
Адрес (номер страницы) |
Номер накладной |
Название товара |
Арти- кул |
Коли-чество |
Дата поставки |
Ссылка на синонимы |
0 |
|
|
|
|
|
|
1 |
12 |
Сапоги |
150 |
150 |
13.12.05 |
|
2 |
|
|
|
|
|
|
3 |
80 |
Туфли |
100 |
100 |
12.12.05 |
|
4 |
37 |
Костюм |
500 |
50 |
10.12.05 |
|
5 |
60 |
Костюм |
500 |
35 |
11.12.05 |
|
6 |
28 |
Костюм |
300 |
20 |
12.12.05 |
|
7 |
18 |
Туфли |
100 |
120 |
11.12.05 |
|
8 |
74 |
Костюм |
400 |
50 |
12.12.05 |
|
9 |
|
|
|
|
|
|
10 |
54 |
Сапоги |
200 |
75 |
10.12.05 |
|
