Принципы построения и работы баз данных Тема 4: Индексирование Принципы построения БД Тема 4 1 Глава 13 Индексирование & Хеширование запись значение Принципы построения БД ? Знач. Тема 4 2 Вопросы • Обычные индексы • Двоичные деревья (B-trees) • Различные схемы хеширования Принципы построения БД Тема 4 3 Последовательный файл 10 20 30 40 50 60 70 80 90 100 Принципы построения БД Тема 4 4 Плотный индекс 10 20 10 20 30 40 30 40 50 60 70 80 50 60 70 80 90 100 90 100 110 120 Принципы построения БД Последоват. файл Тема 4 5 Разреж. индекс 10 20 10 30 50 70 30 40 90 110 130 150 50 60 70 80 90 100 170 190 210 230 Принципы построения БД Последоват. файл Тема 4 6 Последоват. файл Разреж. индекс 2 уровня 10 90 170 250 330 410 490 570 10 20 10 30 50 70 30 40 90 110 130 150 50 60 70 80 90 100 170 190 210 230 Принципы построения БД Тема 4 7 • • • Комментарий: {Файл, Индекс} могут быть непрерывными или в виде цепочек блоков Вопрос: Можно ли построить плотный 2 уровня индекс для плотного индекса? Замечания: 1. Указатель на блок (разреженный индекс) может быть меньше, чем указатель на запись Указатель на блок указатель на запись Принципы построения БД Тема 4 8 2. Если файл непрерывный, то указатели можно не хранить (а вычислять) R1 K1 R2 K2 K3 R3 Пусть в блоке 1024 байта K4 R4 если нужен блок K3: получить его со смещением (3-1)1024 = 2048 bytes Принципы построения БД Тема 4 9 Сравнение плотных и разреженных индексов • разреженный: меньше индексного пространства в расчете на 1 запись, можно хранить больше индексной информации в памяти • плотный: может дать информацию, существует ли запись, без обращения к файлу (Позже: – разреженный лучше для вставок – плотный необходим для вторичных индексов) Принципы построения БД Тема 4 10 Терминология • Индексно-последовательный файл • Ключ поиска ( вообще говоря, отличен от первичного ключа ) • Первичный индекс ( по упорядоченному полю ) • Вторичный индекс • Плотный индекс (когда присутствуют все значения ключа) • Разреженный индекс • Многоуровневый индекс Принципы построения БД Тема 4 11 Следующие вопросы: • Повторяющиеся значения ключа • Удаление/вставка • Вторичные индексы Принципы построения БД Тема 4 12 Повторяющиеся значения ключа 10 10 10 20 20 30 30 30 40 45 Принципы построения БД Тема 4 13 Повторяющиеся значения ключа Один из способов использования плотного индекса? 10 10 10 10 10 20 10 20 20 30 20 30 30 30 Принципы построения БД 30 30 40 45 Тема 4 14 Повторяющиеся значения ключа Плотный индекс. Лучший способ, чем предыдущий? 10 10 10 20 30 40 10 20 20 30 30 30 40 45 Принципы построения БД Тема 4 15 Повторяющиеся значения ключа Необходима осторожность при поиске записей с ключом 20 или 30! Разреженный индекс, один способ. Принципы построения БД 10 10 10 10 20 30 10 20 20 30 30 30 40 45 Тема 4 16 Повторяющиеся значения ключа Разреженный индекс, другой способ. – индекс содержит первый новый ключ в блоке Должно быть 40? 10 10 10 20 30 30 10 20 20 30 30 30 40 45 Принципы построения БД Тема 4 17 Итоги Повторяющиеся значения ключа, первичный индекс • Индех может указывать только на первое из одинаковых значений Файл Индекс a a a . . b Принципы построения БД Тема 4 18 Удаление из разреженного индекса 10 20 10 30 50 70 30 40 50 60 90 110 130 150 Принципы построения БД 70 80 Тема 4 19 Удаление из разреженного индекса – удалить запись с ключом 40 10 20 10 30 50 70 30 40 50 60 90 110 130 150 Принципы построения БД 70 80 Тема 4 20 Удаление из разреженного индекса – удалить запись с ключом 30 10 20 10 40 30 50 70 30 40 40 50 60 90 110 130 150 Принципы построения БД 70 80 Тема 4 21 Удаление из разреженного индекса – удалить записи с ключами 30 и 40 10 20 10 50 30 70 50 70 30 40 50 60 90 110 130 150 Принципы построения БД 70 80 Тема 4 22 Удаление из плотного индекса 10 20 10 20 30 40 30 40 50 60 50 60 70 80 Принципы построения БД 70 80 Тема 4 23 Удаление из плотного индекса – удалить запись с ключом 30 10 20 10 20 40 30 40 30 40 40 50 60 50 60 70 80 Принципы построения БД 70 80 Тема 4 24 Вставка, случай разреженного индекса 10 20 10 30 40 60 30 40 50 60 Принципы построения БД Тема 4 25 Вставка, случай разреженного индекса – вставить запись с ключом 34 10 20 10 30 40 60 30 34 40 50 • удачный день, свободное. пространство там, где нужно! Принципы построения БД Тема 4 60 26 Вставка, случай разреженного индекса – вставить запись с ключом 15 10 20 15 10 20 30 40 60 30 20 30 40 50 • В примере: Немедленная реорганизация • Другой вариант: – вставить новый блок (в цепочку) – обновить индекс Принципы построения БД Тема 4 60 27 Вставка, случай разреженного индекса – вставить запись с ключом 25 10 30 40 60 10 20 25 Блок переполнения (реорганизовать позже ...) 30 40 50 60 Принципы построения БД Тема 4 28 Вставка, случай плотного индекса • Много похожего • Часто более трудоемкая . . . Принципы построения БД Тема 4 29 Вторичные индексы Поле упорядочения 30 50 20 70 80 40 100 10 90 60 Принципы построения БД Тема 4 30 Вторичные индексы Поле упорядочения Разреженный индекс 30 50 30 20 80 100 20 70 80 40 90 ... 100 10 Не имеет смысла! Принципы построения БД Тема 4 90 60 31 Вторичные индексы Поле упорядочения • Плотный индекс 10 50 90 ... 10 20 30 40 30 50 50 60 70 ... 80 40 20 70 100 10 Разреж. индекс более высокого порядка Принципы построения БД 90 60 Тема 4 32 Для вторичного индекса • Самый низкий уровень - плотный • Другие уровни - разряженные Также: Указатели ссылаются на записи (не блоки, не вычисляются) Принципы построения БД Тема 4 33 Повторяющиеся значения ключа и вторичные индексы 20 10 20 40 10 40 10 40 30 40 Принципы построения БД Тема 4 34 Повторяющиеся значения ключа и вторичные индексы Одна возможность... Проблема: Большие накладные расходы! • дисковое про-во • время поиска Принципы построения БД 20 10 10 10 10 20 20 40 20 30 40 40 10 40 10 40 30 40 40 40 ... Тема 4 35 Повторяющиеся значения ключа и вторичные индексы Другая возможность... Проблема: Переменный размер записей в индексе! 10 20 10 20 20 40 10 40 30 40 10 40 30 40 Принципы построения БД Тема 4 36 Повторяющиеся значения ключа и вторичные индексы 10 20 30 40 20 10 20 40 50 60 ... 10 40 Другая идея: Цепочка записей с тем же ключом Проблемы: • Необходимо добавить поле к записи • Необходимо пройти цепочку для получения всех записей Принципы построения БД Тема 4 10 40 30 40 37 Повторяющиеся значения ключа и вторичные индексы 20 10 10 20 30 40 20 40 10 40 50 60 ... 10 40 30 40 сегменты Принципы построения БД Тема 4 38 Почему полезна идея «сегментов» Пусть таблица служащих (EMP) имеет несколько индексов: первичный и 2 вторичных Индексы Записи Name: первичный EMP (name,dept,floor,...) Dept: вторичный Floor: вторичный Принципы построения БД Тема 4 39 Запрос: Получить список служащих в (Toy Dept) & (2nd floor) Dept. индекс EMP Toy Floor индекс 2nd Пересечение сегментов игрушек (toy сегмент) и 2-го этажа (2nd сегмент) для получения списка служащих удовлетворяющих обоим критериям выбора Принципы построения БД Тема 4 40 Эта идея широко используется в информационных системах для извлечения текстовой информации Документы cat ...the cat is fat ... dog ...was raining cats and dogs... ...Fido the dog ... инвертированный список (список записей, имеющих определенное значение вторичного ключа) Принципы построения БД Тема 4 41 IR (information retrieval) запросы • Найти документы со словами “cat” и “dog” • Найти документы со словами “cat” или “dog” • Найти документы со словом“cat”, но без “dog” • Найти документы со словами “cat” в названии • Find articles with “cat” and “dog” within 5 words Принципы построения БД Тема 4 42 Типичный прием: поместить больше информации в инвертированный список cat dog d1 Название 5 Автор 10 Аннотац. 57 d3 d2 Название 100 Название 12 Принципы построения БД Тема 4 43 Регистрация(Posting): элемент инвертированного списка. Представляет появление термина в документе. Размер списка: (в регистрации) 1 106 Редкое слово или опечатка Общеупотребительное слово Размер элемента регистрации: 10-15 bits (сжатый) Принципы построения БД Тема 4 44 Предварительные итоги • Обычный индекс – Основные идеи: плотный, разреженный многоуровневый… – Повторяющиеся значения ключа – Удаление/вставка – Вторичные индексы – Сегменты списков регистрации Принципы построения БД Тема 4 45 Обычные индексы Преимущества: - Просты в использовании - Индекс – последовательный файл, удобный для чтения Недостатки: - Вставка записей - трудоемка, и/или - Приводит к потере последовательности записей Другой подход: Другой тип индекса - Отказ от последовательности индекса - Попытка сбалансировать доступ Принципы построения БД Тема 4 46 Пример Индекс (последовательный) непрерывный 10 20 30 33 40 50 60 39 31 35 36 32 38 34 своб.пр-во 70 80 90 Принципы построения БД Область переполнения (не последовательная) Тема 4 47 Пример сбалансированного двоичного дерева (B+Tree) n=3 Принципы построения БД Тема 4 180 200 150 156 179 120 130 100 101 110 30 35 3 5 11 30 120 150 180 100 Корень 48 К ключам < 57 Принципы построения БД 95 81 57 Пример промежуточного узла «ветки» дерева (не листа) К ключам К ключам К ключам 57 k<81 81k<95 95 Тема 4 49 Пример «лист»-узла: Принципы построения БД Тема 4 95 к следующему листу в последовательности К записи с ключом 95 81 К записи с ключом 81 К записи с ключом 57 57 от узла – «не-листа» 50 Обозначения в книге n=3 Лист: 30 35 30 35 Не-лист: 30 30 Принципы построения БД Тема 4 51 Размер узлов: n+1 указатель n ключей (фиксиров.) Не хотим, чтобы узлы были слишком пустыми Использовать, по крайней мере Не-лист: (n+1)/2 указателей Лист: (n+1)/2 указателей на данные Принципы построения БД Тема 4 52 n=3 30 Лист 30 35 Принципы построения БД Тема 4 Считается, даже если NULL Не-лист 120 150 180 Мин.узел 3 5 11 Полный узел 53 Сбалансированное двоичное дерево(B+tree) порядка n (1) Все листья – на одном и том же самом низком уровне (сбалансированное дерево) (2) Указатели в листьях ссылаются на записи, за исключением указателей формирующих «последовательность листьев» Принципы построения БД Тема 4 54 Число указателей/ключей для B+tree 3-го порядка Max Max Min ptrs keys ptrsdata Min keys Промежут. (не-корень) Лист (не-корень) n+1 n (n+1)/2 (n+1)/2- 1 n+1 n (n+1)/2 (n+1)/2 Корень n+1 n 1 1 Принципы построения БД Тема 4 55 Вставка в B+tree (a) Простой случай – Есть место в «листе» (б) Переполнение «листа» (в) Переполнение промежуточного узла (г) Новый корневой узел Принципы построения БД Тема 4 56 n=3 Принципы построения БД 30 31 32 3 5 11 30 100 (a) Вставить ключ = 32 Тема 4 57 n=3 Принципы построения БД 30 30 31 3 57 11 3 5 7 100 (б) Вставить ключ = 7 Тема 4 58 n=3 Принципы построения БД Тема 4 180 200 180 160 179 150 156 179 120 150 180 160 100 (в) Вставить ключ = 160 59 40 45 40 Тема 4 30 32 40 20 25 10 12 1 2 3 10 20 30 новый корень Принципы построения БД n=3 30 (г) новый корень, вставить 45 60 Удаление из B+tree (a) Простой случай – нет примера (б) Слияние с соседом (в) Перераспределение ключей (г) Случаи (б) или (в) промежуточном узле Принципы построения БД Тема 4 61 (б) Слияние с соседом – Удалить 50 Принципы построения БД 40 50 10 20 30 40 10 40 100 n=4 Тема 4 62 (в) Перераспределение ключей n=4 Принципы построения БД 35 40 50 10 20 30 35 10 40 35 100 – Удалить 50 Тема 4 63 (г) Слияние промеж. узлов – Удалить 37 25 Тема 4 40 45 30 37 30 40 25 26 30 20 22 10 14 1 3 10 20 25 40 Новый корень Принципы построения БД n=4 64 Удаление из B+tree на практике – Часто слияние не реализуется – Слишком трудоемко и не стоит затрат! Принципы построения БД Тема 4 65 Сравнение: B+trees со статическим индексно-последовательным файлом Ссылка #1: Held & Stonebraker “B-Trees Re-examined” CACM, Feb. 1978 - Параллельный доступ труднее в B+Tree - B+tree требует больше пространства Для сравнения использованы: блок = 512 байт ключ = указатель = 4 байта 4 записи в блоке Принципы построения БД Тема 4 66 Пример: 1 блок статического индекса k1 k1 127 ключей k2 k2 k3 k3 (127+1)4 = 512 байт -> указатели в индексе - неявные! Принципы построения БД 1 блок данных до 127 блоков Тема 4 67 пример: 1 блок для B+tree k1 k1 1 блок данных k2 63 ключа k2 ... k63 k3 След. 63x(4+4)+8 = 512 байт -> указатели нужны в B+tree блоках т.к. индекс не явл. непрерывным Принципы построения БД Тема 4 до 63 блоков 68 Сравнение размера Ссылка. #1 Статический индекс Кол-во блоков данных высота 2 -> 127 128 -> 16,129 16,130 -> 2,048,383 Принципы построения БД 2 3 4 B-tree Кол-во блоков данных высота 2 -> 63 64 -> 3968 3969 -> 250,047 250,048 -> 15,752,961 Тема 4 2 3 4 5 69 Анализ приведенный в ссылаемой статье #1 утверждает • Для файла из 8,000 блоков, после 32,000 вставок после 16,000 поисков Статический индекс экономит достаточно поисков для реорганизации #1 вывод Принципы построения БД Статический индекс лучше!! Тема 4 70 Ссылка #2: M. Stonebraker, “Retrospective on a database system,” TODS, June 1980 B-tree лучше!! #2 вывод • Администратор БД не знает, когда нужна реорганизация индекса • Администратор БД не знает, насколько полно загружать страницы нового индекса Принципы построения БД Тема 4 71 Интересная задача: Для B+tree насколько большим должен быть порядок n ? … n – число ключей в узле Простые предположения (1) Время чтения узла с диска - (70+0.05n) msec. (2) В памяти для отыскания ключа использется двоичный поиск: (a + b LOG2 n) msec. Где a,b – некоторые константы (предположим a << 70 ) (3) Предположим также, что B+tree заполнено, т.е. число проверяемых узлов – LOGnN , где – N число записей Принципы построения БД Тема 4 72 Можно оценить: f(n) = время получения записи f(n) nopt n Найти nopt из уравнения f’(n) = 0 (подробнее в дом.работе) Что будет происходить с nopt по мере того как • Диск становится быстрее? • Процессор становится быстрее? Принципы построения БД Тема 4 73 Вариация B+tree: B-tree (без +) • Основная идея: – Избежание дубликатов ключей – Ссылки на записи из промежуточных узлов K1 P1 к записям с ключом K1 К ключам < K1 Принципы построения БД K2 P2 K3 P3 к записям с ключом K2 К ключам K1<x<K2 к записям с ключом К3 К ключам K2<x<k3 Тема 4 К ключам >k3 74 Пример -tree n=2 Принципы построения БД Тема 4 170 180 150 160 145 165 130 140 110 120 90 100 70 80 50 60 30 40 10 20 25 45 85 105 65 125 • указатели задающие последовательность листьев бесполезны (но место за ними для Простоты сохранено) 75 Замечание по поводу вставки • Предположим, вставляется запись с ключом = 25 10 20 30 лист n=3 Принципы построения БД 25 30 10 – 20 – • После вставки: Тема 4 76 Итак, для B-tree: MAX MIN Указ Указ Ключ узел зап. Не-лист Не-кор. Лист Не-кор. Корень Не-лист Корень Лист Принципы построения БД Указ узел Указ зап. Ключ (n+1)/2 (n+1)/2-1 (n+1)/2-1 n+1 n n 1 n n 1 n+1 n n 2 1 1 1 n n 1 1 1 Тема 4 (n+1)/2 (n+1)/2 77 Сравнение: Поиск в B-tree быстрее, чем в B+trees В B-tree, промежуточные узлы и листья имеют разные размеры В B-tree, удаление более сложное B+tree предпочтительнее! Замечание. Если блоки фиксированного размера (из-за ограничений диска или буферизации) то поиск в B+tree на самом деле лучше!! Принципы построения БД Тема 4 78 Пример: - Указатели 4 байта - Ключи 4 байта - Блоки 100 байт (для примера) - Рассмотрим полное 2-х уровневое дерево B-tree: Корень имеет 8 ключей + 8 указателей на записи + 9 указателей на детей= 8x4 + 8x4 + 9x4 = 100 bytes Каждый из 9 сыновей: 12 указателей на записи(+12 ключей) = 12x(4+4) + 4 = 100 bytes 2-х уров. B-tree, макс.кол-во записей =12x9 + 8 = 116 Принципы построения БД Тема 4 79 B+tree: Корень имеет 12 ключей + 13 указателей на детей = 12x4 + 13x4 = 100 bytes Каждый из 13 сыновей: 12 указателей на записи(+12 ключей) = 12x(4 +4) + 4 = 100 bytes 2-х уров. B+tree, макс.кол-во записей =13х12 = 156 8 записей Более «кустистое» B+ B ooooooooooooo ooooooooo 108 записей 156 записей Принципы построения БД Тема 4 80