Введение в базы данных

Хранение данных и индексирование

Подсистема хранения данных

Содержание

Структура

Содержание

Типы памяти

Тип Характеристика Величина
Оперативная память Объем 8−256 ГБ
Цена 3-10 $/ГБ
Быстродействие ~10 ГБ/c
Время доступа 1−10 μ/c
SSD Объем 0.5−4 ТБ
Цена 0.5 $/ГБ
Быстродействие 300−1000 МБ/c
Время доступа 0.1−0.2 мс
Жёсткие диски Объем 4−12 ТБ
Цена 0.03 $/ГБ
Быстродействие 5−200 МБ/c
Время доступа 5−15 мc

Особенности жёстких дисков

  • Большое время поиска
  • Скорость чтения
    • Последовательный доступ – средняя
    • Случайный доступ – низкая
  • Сократить количество обращений

Страницы памяти

  • Память разбита на равные страницы
    • Прямое отображение в память
    • Загрузка и выгрузка всей страницы
    • Для IA32 и AMD64 обычно 4КБ, 2МБ или 4МБ
  • Обработка быстрее чем чтение
  • Последовательности страниц
    • Данные одного типа
    • Частые переходы к следующей/предыдущей странице
    • Желательно хранить последовательно

Доступ к данным

Модули системы хранения

  • Диспетчер диска
    • Каталог страниц
    • Оптимизация последовательностей страниц
  • Диспетчер страниц
    • Доступ к страницам
    • Распределение памяти
    • Выгрузка данных
  • Диспетчер записей
    • Доступ к записям

Организация данных

Содержание

Организация данных

  • Файл – одна или несколько таблиц
  • Таблица – несколько страниц
  • Страница – несколько записей
  • Какие проблемы?
    • Записи длиннее страницы

Список страниц

  • Диспетчер диска – последовательности
  • Диспетчер памяти – предвыборка

Идентификатор записи

  • Id записи (RID)
    • Id страницы
    • Id записи на странице
  • Используется во многих местах
    • Не должен меняться
  • Как хранить данные страницы?

Записи на странице

  • Что делать, когда записи не помещаются?

Страницы переполнения

  • Как избежать цепочек?
    • Изменять ссылки на исходной странице

Сжатие данных

  • Данные на страницах можно сжимать
    • Больше вычислений
    • Меньше ввода-вывода
    • Часто – быстрее
  • Использование структуры данных
    • Сжатие по полям
    • Инкрементальное сжатие
    • Префиксное сжатие

Индексация данных

Содержание

Индексы

Содержание

Зачем нужна индексация?

  • Несколько миллионов записей
  • Как найти нужную?
    • Полный просмотр таблицы
    • Индексация

Полный просмотр таблицы

  • Последовательный перебор записей
  • Размер таблиц
    • Большие и средние – медленно
    • Маленькие – быстро
  • Количество выбираемых данных
    • Малая доля – медленно
    • Бóльшая часть – быстро

Индекс

  • Набор столбцов
    • Не обязательно ключ
  • Предварительная обработка
    • При построении
    • При обновлении
  • Быстрый поиск в индексе
    • Указатель на данные

Структура индекса

  • Почему не хранить данные в порядке индекса?

Кластеризованный индекс

  • Выше скорость просмотра
  • Может быть только один

Хеш-индексы

Содержание

Хеш-индекс

  • Предварительная обработка
    • Подсчёт хешей ключей
    • Разбиение на корзины
  • Поиск в индексе
    • Просмотр корзины
    • Несколько ключей в корзине
  • Заголовок помещается в памяти

Простой хеш-индекс

  • Что делать, если корзина не помещается на страницу?

Последовательности страниц

  • Линейное время поиска
  • Что делать с большими корзинами?
    • Перехеширование очень дорого

Расширяемое хеширование

  • Большое количество корзин
  • Несколько корзин на одной странице
    • Обычно – последовательных
    • Разделение корзин при переполнении страницы
  • При плохой хеш-функции – не поможет

Побитное расш. хеширование

  • Глубина хеша $n$
    • $2^n$ корзин
  • Локальная глубина страницы $k$
    • $2^{n-k}$ корзин на странице
    • Может быть разной
  • Разделение корзин
    • Страница глубины $k$ разделяется на две глубины $k + 1$

Ускоряемые запросы

  • Проверка существования ключа
    • Проверка повторений (ключи)
    • in
    • exist
    • count
  • Поиск по ключу
    • Естественные соединения

Упорядоченные индексы

Содержание

Упорядоченные индексы

  • Предварительная обработка
    • Ключи упорядочиваются по возрастанию
  • Поиск в индексе
    • Поиск в упорядоченной последовательности
  • Требуемые операции
    • Вставка
    • Удаление
    • Быстрый поиск
  • Какую структуру данных использовать?

Деревья поиска

  • Количество операций
    • $O(высота)$
    • Минимизировать высоту
  • Размер узла
    • Размер страницы
    • Сильно ветвящиеся

B и B+ -деревья

  • $B$ деревья степени $n$
    • От $n/2$ до $n$ детей
    • Указатели и ключи хранятся в узлах
  • $B^+$ деревья степени $n$
    • От $n/2$ до $n$ детей
    • Указатели хранятся в листьях
  • Сравнение
    • В $B^+$ меньше данных в узлах – сильнее ветвятся
    • $B^+$ на одну страницу глубже
  • Корень и несколько первых уровней – в памяти

Плотные и разреженные

  • Плотный индекс
    • Ключи всех элементов
  • Разряженные индекс
    • Ключи части элементов
    • Обычно – один на страницу
    • Кластеризованный

Данные и индексация

  • Строки
    • Много данных в ключе – меньше степень ветвления
    • Можно использовать префиксы
  • Суррогатные ключи
    • Малый размер
    • Выше эффективность
  • Изменяющиеся данные
    • Частое обновление индекса
    • Уменьшение индекса

Ускоряемые запросы

  • Проверка существования ключа
  • Поиск по ключу
  • Минимум и максимум
  • Диапазон
    • Загрузка
    • count
  • like по префиксу

Другие типы индексов

Содержание

Пример битового индекса

Битовый (bitmap) индекс

  • По одному биту на каждое возможное значение
    • Хранятся битовые маски
    • По столбцам
  • Ускоряемые запросы
    • Логические выражения
    • count
  • Долгое обновление

Многозначный битовый индекс

Битовый индекс с накоплением

Составной битовый индекс

Запрос по битовому индексу

  • Gender = 'М' and Year >= 3
  • М and 3

Оптимизация битового индекса

  • Часто целиком помещаются в памяти
  • Сжатие индекса
    • RLE-кодирование
    • Byte-aligned Bitmap Code – логические операции без распаковки
  • Создание корзин
    • Склеивание некоторых значений
  • Оцените размер битового индекса
    • Число записей × число полей

Пример R-дерева

  • Составные индексы

R-деревья

  • Разбиение данных на параллелепипеды
    • Минимальные охватывающие
  • Ускоряемые запросы
    • Диапазоны по нескольким координатам
    • Поиск ближайших значений

Применение индексов

Содержание

Когда используется индекс?

  • Заданы значения префикса индекса
    • Индекс по (Фамилия, Имя), ищем по фамилии
    • В том числе null
    • Возможность использования диапазонов

Селективность индекса

  • Насколько хорошо индекс «раскидывает» данные
    • Процент записей, получаемых по значению
    • count distinct / count – среднее
    • max count / count – худшее
  • Примеры
    • Номер паспорта – хорошая селективность
    • Возраст человека – средняя селективность
    • Пол человека – плохая селективность

Оценка селективности

  • Статистика
    • Предыдущие запросы
    • Специальный подсчёт
  • Хеш-индексы
    • Размеры и количество корзин
  • $B$-деревья
    • Верхние уровни – гистограмма распределения
  • При плохой селективности индекс не используется

Покрывающий индекс

  • В индексе есть все требуемые столбцы
    • Не требуется загрузка записи
  • Дополнительные столбцы индекса
    • По которым индексация не требуется
    • Увеличение размера индекса

Рекомендации

  • Индексы на ключи
  • Индексы на внешние ключи
  • Индексы на запросы по диапазонам
  • Индексы таблиц связей
    • Индекс на ($id_1$, $id_2$) и ($id_2$, $id_1$)
  • Индексы на строки
    • Только для массовых операций над строками

Индексы и SQL

  • При определении таблицы
    • index {unique|sparse|spatial} [using тип] (столбцы)
      
  • После определения таблицы
    • create {unique|sparse|spatial} index [using тип] 
      on таблица (столбцы)
      

Литература

Содержание

Основная литература

  • Дейт К. Введение в системы баз данных (Приложение Г)

Дополнительная литература

  • Кнут Д. Искусство программирования. Том 3. Сортировка и поиск
  • Silberschatz A., Korth H. F., Sudarshan S. Database System Concepts