Принципы построения и работы баз данных Тема 05: Хэширование и другие вопросы. Принципы построения БД Тема 5 1 Хэширование <key> key h(key) . . . Принципы построения БД Тема 5 Ячейки (обычно 1 диск.блок ) 2 Две возможности . . . записи (1) key h(key) Принципы построения БД . . . Тема 5 3 Две возможности (2) key h(key) ключ запись Индекс (2) – для вторичного ключа поиска Принципы построения БД Тема 5 4 Пример функции хэширования • Ключ = ‘x1 x2 … xn’ строка символов длиной n байт • Пусть имеется m ячеек • h: сложить x1 + x2 + ….. хn как целые числа – вычислить сумму по модулю b Это может быть не лучшей хэш-функцией Д.Кнут. Искусство программирования для ЭВМ. Т.3. (Если хотите Узнать как выбрать хорошую хэш-функцию.) Хорошая функция обладает свойством: среднее ожидаемое количество ключей в ячейке одинаково для всех ячеек Принципы построения БД Тема 5 5 Внутри ячейки: • Нужно ли держать ключи отсортированными? • Да, если время обработки процессором критично & Вставки.удаления не слишком часты Далее: Пример для иллюстрации вставок, переполнения, удалений h(key) Принципы построения БД Тема 5 6 Пример 2 записи на ячейку Вставка: h(a) = 1 h(b) = 2 h(c) = 1 h(d) = 0 0 d 1 a c 2 b e 3 h(e) = 1 Принципы построения БД Тема 5 7 Пример: удаление Удалить: e f c 0 a 1 b c d e 2 3 Принципы построения БД f g Тема 5 d М.б. перенести “g” в предыдущий блок 8 Главное правило: Использование пространства ячейки от 50% до 80% Использование = число использованных мест общее число мест в ячейке • Если < 50%, теряем дисковое пространство • Если > 80%, переполнение может быть значительным, зависит от качества хэш-функции и количества ключей в ячейке Принципы построения БД Тема 5 9 Как бороться с ростом хэш-таблицы (файла)? • Переполнение и реорганизация • Динамическое хэширование • Расширяемая схема • Линейная схема Принципы построения БД Тема 5 10 Расширяемая схема: две идеи (a) Использовать j из b битов значения хэш-функции b 00110101 h(K) исп. j может расти со временем... (б) Использование оглавления . . . h(K)[j ] к ячейке . . . Принципы построения БД Тема 5 11 Пример: h(k) дает 4 бита; 2 ключа/ячейку j=2 1 0001 j= 1 00 01 10 1 2 1001 1010 1100 Вставить 1010 Принципы построения БД 11 Новое оглавление 1 2 1100 Тема 5 12 Продолжение примера j= 2 00 01 10 11 Вставить: 0111 2 0000 0001 1 2 0001 0111 0111 2 1001 1010 2 1100 0000 Принципы построения БД Тема 5 13 Продолжение примера 0000 2 i= 2 0001 00 0111 2 01 10 11 Вставить: 1001 Принципы построения БД 1001 3 1001 1010 1001 2 3 1010 1100 2 Тема 5 j=3 000 001 010 011 100 101 110 111 14 Расширяемая схема: удаление • Без слияния блоков • Слияние блоков и сокращение оглавления если возможно (процедура – обратная вставке) Пример удаления •Рассмотрите вставку в обратном порядке Принципы построения БД Тема 5 15 Итог Расширяемая схема + Справляется с растущими файлами - с меньшей потерей пространства - без полной реорганизации - Косвенная адресация (хорошо если оглавление в памяти) - Оглавление увеличивается в 2 раза (То умещается, то нет) Принципы построения БД Тема 5 16 Линейная схема • Другая динамическая схема Две идеи: (a) Использование младших j битов значения хэш-функции b 01110101 растет (б) Файл растет линейно (в) Пороговое значение U = число записей число ячеек Принципы построения БД Тема 5 j <= v (=1.6) 17 Пример b=4 bits, j =1, 2 ключа/ячейку • вставка 0101 0000 1010 0101 1111 0 1 m = 01 (max номер блока) Правило Если h(k)[j ] m, то проверять ячейку h(k)[ j ], иначе проверять ячейку h(k)[j ] - 2j -1 Принципы построения БД Тема 5 18 Пример b=4 bits, j =2, 2 ключа/ячейку 0000 00 0101 1111 1010 01 10 Ячейки для будущего роста 11 m = 01 (max номер блока) 10 Правило Если h(k)[j ] m, то проверять ячейку h(k)[ j ] иначе проверять ячейку h(k)[j ] - 2j -1 Принципы построения БД Тема 5 19 Пример b=4 bits, j =2, 2 ключа/ячейку 0101 0000 00 • вставка 0101 • может иметь цеп.переполнения! 0101 1111 1010 01 10 Ячейки для будущего роста 11 m = 01 (max номер блока) 10 Если h(k)[j ] m, то проверять ячейку h(k)[ j ], Правило иначе проверять ячейку h(k)[j ] - 2j -1 Принципы построения БД Тема 5 20 Пример b=4 bits, j =2, 2 ключа/ячейку 0101 0000 1010 00 0101 0101 1111 • вставка 0101 1010 1111 Ячейки для будущего роста 01 10 11 m = 01 (max номер блока) 10 11 Принципы построения БД Тема 5 21 Продолжение примера: Как расти дальше? j=23 0000 0 00 100 0101 0101 0 01 101 1010 0101 0101 1111 010 110 0 11 111 100 101 ... m = 11 (max номер блока) 100 101 Принципы построения БД Тема 5 22 Когда расширяется файл? • Следите за: кол-во записей =U общее кол-во ячеек • Если U > порогового значения, то увеличить m (и может быть j ) Принципы построения БД Тема 5 23 Итог Линейная схема + Справляется с растущими файлами - с меньшей потерей пространства - без полной реорганизации + Нет необходимости в косвенной адресации - Может иметь цепочки переполнения Принципы построения БД Тема 5 24 Пример: «Плохой» частный случай Очень полная ячейка Очень пустые Нужно увел. m… Приведет к потере пространства... Принципы построения БД Тема 5 25 Далее: • Сравнение индексирования и хэширования • Определение индекса в SQL • Доступ с использованием нескольких ключей Принципы построения БД Тема 5 26 Сравнение индексирования и хэширования • Хеширование хорошо для выбора записей с заданным значением ключа, например SELECT … FROM R WHERE R.A = 5 • Индексирование (включая B-Trees) хорошо для поиска записей со значениями из (полу-) интервала SELECT ... FROM R WHERE R.A > 5 Принципы построения БД Тема 5 27 Определение индекса в SQL • CREATE INDEX имя_индекса ON rel (attr) • CREATE UNIQUE INDEX имя_индекса ON rel(attr) Определяет возможный ключ отношения • DROP INDEX имя_индекса Принципы построения БД Тема 5 28 Замечания Нельзя задать тип индекса ( например, B-tree, хэширование, …) или параметры (заполненность, размер хэш-таблицы,...) По крайней мере стандарт SQL этого не позволяет... Можно задавать список атрибутов в качестве ключа многомерный индекс CREATE INDEX имя_индекса ON R(A,B,C) Принципы построения БД Тема 5 29 Многомерный индекс Мотивация: Найти все записи, у которых DEPT = “Toy” AND SAL > 50k Стратегия 1: • Использовать один индекс, например Dept. • Получить все записи с Dept = “Toy” и проверить зарплату I1 Принципы построения БД Тема 5 30 Стратегия 2: Использовать 2 индекса; манипулировать указателями Toy Sal > 50k Стратегия 3: Многомерный индекс I2 I1 Принципы построения БД Тема 5 I2 31 Пример Art Sales Toy Dept индекс 10k 15k 17k 21k Пример записи Name=Joe DEPT=Sales SAL=15k 12k 15k 15k 19k Salary индекс Принципы построения БД Тема 5 32 Для каких запросов хорош этот индекс? Найти записи с Dept = “Sales” & SAL=20k Найти записи с Dept = “Sales” & SAL > 20k Найти записи с Dept = “Sales” Найти записи с SAL = 20k Принципы построения БД Тема 5 33 Интересное приложение: • Географические(пространственные) данные Данные: <X1,Y1, атрибуты> <X2,Y2, атрибуты> ... y x Запросы: • Какой город находится в <Xi,Yi>? • Что находится в 5 милях от <Xi,Yi>? • Что ближе всех к <Xi,Yi>? Принципы построения БД Тема 5 34 40 Пример 10 25 20 20 10 e h 30 20 15 35 i n o j k m 10 5 h i f 15 15 j k g l Принципы построения БД m d e c b f l a d c g 20 a b • Поиск точек близких к f • Поиск точек близких к b n o Тема 5 35 Запросы • • • • Найти точки с Yi > 20 Найти точки с Xi < 5 Найти точки“близкие” к i = <12,38> Найти точки“близкие” к b = <7,24> • Используется несколько типов географических индексов • Q деревья • R деревья Принципы построения БД Тема 5 36 Еще два типа многомерных индексов • Сеточный файл(индекс) • Хэш-разбиение Сеточный индекс X1 X2 V1 V2 Key 1 Key 2 …… Xn Vn К записи с ключом key1=V3, key2=X2 Принципы построения БД Тема 5 37 Утверждение • Может быстро находить записи с – ключ 1 = Vi & ключ 2 = Xj – ключ 1 = Vi – ключ 2 = Xj • А также записи с ключами из диапазона. – ключ 1 Vi & ключ 2 < Xj Принципы построения БД Тема 5 38 Имеется загвоздка в сеточном индексе! V2 V3 X1 X2 X3 X4 X1 X2 X3 X4 Как массив V1 X1 X2 X3 X4 • Как сеточный индекс хранится на диске? Проблема: • Необходима регулярность данных для вычисления позиции элемента <Vi,Xj> Принципы построения БД Тема 5 39 Решение: Использовать косвенную адресацию X1 X2 X3 Ячейки ---------- V1 V2 V3 V4 Ячейки Принципы построения БД ---- *сетка содержит указатели на ячейки ---Тема 5 40 При косвенной адресации: • Сетка может быть регулярной без потери пространства • Однако необходима дополнительные затраты на обработку косвенной адресации Принципы построения БД Тема 5 41 Можно индексировать сетку по интервалам Зарплата Сетка 1 2 50K- 3 8 0-20K 20K-50K 1 3 Toy Sales Personnel Линейная шкала Принципы построения БД 2 Тема 5 42 Сеточные файлы + Удобны для поиска по многомерному ключу - Дополнительные затраты памяти и обработки (нет ничего бесплатного) - Нуждается в равномерном разбиении значений ключей Принципы построения БД Тема 5 43 Хэш-разбиение Идея: ключ1 Принципы построения БД 010110 1110010 h1 h2 Тема 5 ключ2 44 Пример: h1(toy) h1(sales) h1(art) . . h2(10k) h2(20k) h2(30k) h2(40k) . . Вставка Принципы построения БД =0 =1 =1 =01 =11 =01 =00 000 001 010 011 100 101 110 111 <Fred> <Joe><Sally> <Fred,toy,10k>,<Joe,sales,10k> <Sally,art,30k> Тема 5 45 h1(toy) =0 000 <Fred> h1(sales) =1 001 <Joe><Jan> h1(art) =1 010 <Mary> . 011 . <Sally> h2(10k) =01 100 h2(20k) =11 101 <Tom><Bill> h2(30k) =01 110 <Andy> h2(40k) =00 111 . . • Найти служащих с Dept. = Sales & Sal=40k Принципы построения БД Тема 5 46 h1(toy) =0 000 <Fred> h1(sales) =1 001 <Joe><Jan> h1(art) =1 010 <Mary> . 011 . <Sally> h2(10k) =01 100 h2(20k) =11 101 <Tom><Bill> h2(30k) =01 110 <Andy> h2(40k) =00 111 . . • Найти служащих с Sal=30k Искать здесь Принципы построения БД Тема 5 47 h1(toy) =0 000 <Fred> h1(sales) =1 001 <Joe><Jan> h1(art) =1 010 <Mary> . 011 . <Sally> h2(10k) =01 100 h2(20k) =11 101 <Tom><Bill> h2(30k) =01 110 <Andy> h2(40k) =00 111 . . • Найти служ. с Dept. = Sales Искать здесь Принципы построения БД Тема 5 48 Итоги - Индексирование против хэширокания - Определение индексов в SQL - Доступ при многомерном ключе - многомерный индекс Вариации: Сетка, Географические данные - Хэш-разбиение Принципы построения БД Тема 5 49