Лекция 8. Таблицы и хранение данных
Хеш-таблица как движок хранения
- Данные хранятся в файле, в который можно только дописывать в конец (append-only log).
- В оперативной памяти хранится хеш-таблица (словарь): ключ → смещение (offset) в файле данных.

Запись: добавляем пару «ключ-значение» в конец файла и обновляем хеш-таблицу. Чтение: по ключу находим смещение в хеш-таблице, переходим по нему в файле и читаем значение.
Сегменты
- Разбиваем журнал на сегменты фиксированного размера.
- При заполнении сегмента — закрываем его и начинаем новый.
- Запускаем фоновый процесс уплотнения (compaction) и слияния (merging) сегментов.
Уплотнение (compaction)
- Удаление дубликатов ключей.
- Сохранение только самой последней версии значения для каждого ключа.
Слияние (merging)
- Объединение нескольких небольших сегментов в один новый.
- Позволяет уменьшить общее количество сегментов.

Алгоритм чтения
- Поиск начинается в хеш-таблице самого свежего сегмента.
- Если ключ не найден — проверяется следующий по старшинству сегмент.
- И так далее, пока ключ не будет найден или не будут проверены все сегменты.
Преимущества append-only подхода
- Высокая производительность записи. Последовательная запись на диск намного быстрее случайной.
- Надёжность. Упрощение конкурентного доступа и восстановления после сбоев — нет риска «полузаписанных» данных.
- Борьба с фрагментацией. Процесс слияния сегментов естественным образом переписывает данные в компактном виде.
Ограничения хеш-движка
- Ключи должны помещаться в ОЗУ. Хеш-таблица на диске медленная из-за случайных чтений, дорогого расширения и сложности разрешения коллизий.
- Неэффективные диапазонные запросы. Нельзя быстро найти все ключи от
00000до99999— нужно обращаться к хеш-таблице для каждого ключа в диапазоне отдельно.
SS-Table (Sorted String Table)
Особенности
- Данные отсортированы по ключу.
- Каждый ключ встречается только один раз (обеспечивается уплотнением).
- Порядок записи значений не важен — приоритет у более новых значений.
Слияние
- Алгоритм аналогичен сортировке слиянием (merge sort).
- Работает даже когда данные не помещаются в оперативной памяти.
- При конфликте ключей берётся значение из самого нового сегмента.
Разреженный индекс
- Не нужно хранить все ключи — только некоторые ориентиры.
- Пример: известны смещения для
"handbag"и"handsome"→"handiwork"находится между ними. - Можно быстро просканировать небольшой диапазон.
MemTable
- Сбалансированное дерево в оперативной памяти (красно-чёрное, AVL).
- Данные сохраняются отсортированными по ключу.
- Быстрая вставка в любом порядке.
Надёжность
- Все операции немедленно записываются в журнал (WAL).
- Журнал неупорядочен — используется только для восстановления.
- После записи MemTable в SS-таблицу журнал удаляется.
Алгоритм работы (LSM-tree)
- Запись. Добавляется в MemTable и параллельно пишется в журнал для надёжности.
- Чтение. Поиск в MemTable → последнем сегменте → предыдущем → и т.д.
- Фоновые процессы. При превышении лимита MemTable записывается в SS-таблицу. Регулярное слияние и уплотнение сегментов.
Фильтр Блума
- Эффективная проверка отсутствия ключа.
- Избегание ненужных чтений с диска.
- Ответ: «возможно есть» / «точно нет».
Write-Ahead Log
- Файл только для добавления (append-only).
- Быстрая последовательная запись.
- Используется для восстановления после сбоев.
Защёлки (latches)
- Облегчённые версии блокировок.
- Защита структур данных при одновременном доступе.
- Высокая производительность (быстрее обычных блокировок, но используются для коротких критических секций).
LSM-tree vs B-tree
- LSM-деревья: обычно быстрее при записи.
- B-деревья: обычно быстрее при чтении.
Модель доступа
Дискреционная модель доступа (DAC)
Модель управления доступом, при которой владельцы объектов (таблиц, схем, представлений и т.д.) в базе данных самостоятельно определяют, кто и какие действия может выполнять с этими объектами.
Роли
- В PostgreSQL понятие «пользователь» является частным случаем роли. Каждая роль может иметь или не иметь возможность входа в систему (login privilege). Если у роли установлено свойство
LOGIN, она может использоваться как учётная запись пользователя. - Роли могут быть членами других ролей. Это позволяет организовывать группы пользователей — например, создать роль
developers, которой будут принадлежать все разработчики, и назначить этой роли общие привилегии.
Команды и атрибуты
CREATE ROLE name [attr1, attr2, ...];
ALTER ROLE developer WITH PASSWORD 'newsecret';
Атрибуты ролей:
LOGIN— возможность входа в систему.SUPERUSER— суперпользователь, обходящий все проверки прав.CREATEDB— может создавать базы данных.CREATEROLE— может создавать другие роли.PASSWORD 'secret'— пароль.
Наследование привилегий
- Роль, являющаяся членом другой роли, по умолчанию автоматически наследует все её привилегии.
GRANT role1 TO role2;
REVOKE role1 FROM role2;
Привилегии таблиц
SELECTINSERTUPDATEREFERENCESDELETETRUNCATETRIGGER
Привилегии БД
CREATECONNECTTEMPORARY
Привилегии схем
CREATEUSAGE
Права доступа к схеме влияют на возможность создания новых объектов, но сами по себе не контролируют доступ к уже существующим объектам. Для этого необходимо назначать привилегии непосредственно на уровне объектов.