Организация данных
Физическая структура
12
Авторские права
© Postgres Professional, 2017–2021
Авторы: Егор Рогов, Павел Лузанов
Использование материалов курса
Некоммерческое использование материалов курса (презентации,
демонстрации) разрешается без ограничений. Коммерческое
использование возможно только с письменного разрешения компании
Postgres Professional. Запрещается внесение изменений в материалы
курса.
Обратная связь
Отзывы, замечания и предложения направляйте по адресу:
Отказ от ответственности
Компания Postgres Professional не несет никакой ответственности за
любые повреждения и убытки, включая потерю дохода, нанесенные
прямым или непрямым, специальным или случайным использованием
материалов курса. Компания Postgres Professional не предоставляет
каких-либо гарантий на материалы курса. Материалы курса
предоставляются на основе принципа «как есть» и компания Postgres
Professional не обязана предоставлять сопровождение, поддержку,
обновления, расширения и изменения.
2
Темы
Табличные пространства и каталоги
Файлы и страницы данных
Слои: данные, карты видимости и свободного пространства
Технология TOAST
3
template1
postgres
Табличные пространства
pg_catalog public pg_catalog publicсхема
табл. пр-во
pg_global
табличное
пр-во
табл. пр-во
pg_default
таблица
таблица
объект
таблица
таблица
объект
таблица
таблица
объект
таблица
таблица
объект
таблица
таблица
объект
таблица
таблица
объект
таблица
таблица
объект
таблица
таблица
объект
таблица
таблица
объект
таблица
таблица
объект
таблица
таблица
объект
ТП по
умолчанию
ТП по
умолчанию
Табличные пространства (ТП) служат для организации физического
хранения данных и определяют расположение данных в файловой
системе.
Например, можно создать одно табличное пространство на медленных
дисках для архивных данных, а другое – на быстрых дисках для
данных, с которыми идет активная работа.
При инициализации кластера создаются два табличных пространства:
pg_default и pg_global.
Одно и то же табличное пространство может использоваться разными
базами данных, а одна база данных может хранить данные в
нескольких табличных пространствах.
При этом у каждой БД есть так называемое «табличное пространство
по умолчанию», в котором создаются все объекты, если явно не указать
иное. В этом же табличном пространстве хранятся и объекты
системного каталога. Изначально в качестве «табличного пространства
по умолчанию» используется pg_default, но можно установить и другое.
Табличное пространство pg_global особенное: в нем хранятся те
объекты системного каталога, которые являются общими для кластера.
4
template1postgres
Каталоги
табл. пр-во
pg_global
табличное
пр-во
табл. пр-во
pg_default
таблица
таблица
объект
таблица
таблица
объект
таблица
таблица
объект
таблица
таблица
объект
таблица
таблица
объект
таблица
таблица
объект
таблица
таблица
объект
PGDATA/global/
...
...
...
PGDATA/base/dboid /
...
NNN
NNN.1
NNN.2
...
PGDATA/pg_tblspc/tsoid
/путь-к-каталогу/ver/dboid/
...
...
...
По сути, табличное пространствоэто указание на каталог, в котором
располагаются данные. Стандартные табличные пространства
pg_global и pg_default всегда находятся в PGDATA/global/ и
PGDATA/base/ соответственно.
При создании пользовательского табличного пространства указывается
произвольный каталог. Сервер всегда использует относительные пути,
поэтому на указанный каталог дополнительно создается символьная
ссылка в каталоге PGDATA/pg_tblspc/.
Внутри каталога PGDATA/base/ данные дополнительно разложены по
подкаталогам баз данных (для PGDATA.global/ это не требуется, так как
данные в нем относятся к кластеру в целом).
Внутри каталога пользовательского табличного пространства
появляется еще один уровень вложенности: подкаталог для версии
сервера PostgreSQL. Это сделано для удобства обновления сервера на
другую версию.
Сами объекты хранятся в файлах внутри этих каталогов. У каждого
объекта собственный набор файлов: в одном файле находятся данные
только одного объекта
Каждый файл, называемый сегментом, занимает по умолчанию не
более 1 Гбайт (этот размер можно изменить при сборке сервера).
Поэтому каждому объекту может соответствовать несколько файлов.
Необходимо учитывать влияние потенциально большого количества
файлов на используемую файловую систему.
6
Основной
собственно данные
Карта свободного
пространства
в страницах после
очистки
Карта видимости
отмечает страницы,
на которых все
версии строк
видны во всех снимках
Слои и файлы
сегмент
1 ГБ
страница
8 КБ
Обычно каждому объекту соответствует несколько слоев (forks).
Каждый слой — это набор сегментов (то есть файл или несколько
файлов). Все файлы-сегменты разбиты на отдельные страницы,
обычно по 8 Кбайт (размер можно установить для всего кластера
только при сборке сервера). Страницы разных объектов считываются
с диска совершенно однотипно через общий механизм буферного кеша.
Основной слой — это собственно данные: версии строк таблиц или
строки индексов.
Слой vm (visibility map) — битовая карта видимости. В ней отмечены
страницы, которые содержат только актуальные версии строк, видимые
во всех снимках данных. Иными словами, это страницы, которые давно
не изменялись и успели полностью очиститься от неактуальных версий.
Карта видимости применяется для оптимизации очистки (отмеченные
страницы не нуждаются в очистке) и для ускорения индексного доступа.
Дело в том, что информация о версионности хранится только для
таблиц, но не для индексов (поэтому у индексов не бывает карты
видимости). Получив из индекса ссылку на версию строки, нужно
прочитать табличную страницу, чтобы проверить ее видимость. Но если
в самом индексе уже есть все нужные столбцы, и при этом страница
отмечена в карте видимости, то к таблице можно не обращаться.
Слой fsm (free space map) — карта свободного пространства. В ней
отмечено доступное место внутри страниц, образующееся при очистке.
Эта карта используется при вставке новых версий строк, чтобы быстро
найти подходящую страницу.
8
TOAST
Версия строки должна помещаться на одну страницу
можно сжать часть атрибутов,
или вынести в отдельную TOAST-таблицу,
или сжать и вынести одновременно
TOAST-таблица
схема pg_toast
поддержана собственным индексом
«длинные» атрибуты разделены на части размером меньше страницы
читается только при обращении к «длинному» атрибуту
собственная версионность
работает прозрачно для приложения
Любая версия строки в PostgreSQL должна целиком помещаться на
одну страницу. Для «длинных» версий строк применяется технология
TOAST The Oversized Attributes Storage Technique. Она
подразумевает несколько стратегий. Подходящий «длинный» атрибут
может быть сжат так, чтобы версия строки поместилась на страницу.
Если это не получается, атрибут может быть отправлен в отдельную
служебную таблицу. Могут применяться и оба подхода.
Для каждой основной таблицы при необходимости создается отдельная
toast-таблица (и к ней специальный индекс). Такие таблицы и индексы
располагаются в отдельной схеме pg_toast и поэтому обычно не видны.
Версии строк в toast-таблице тоже должны помещаться на одну
страницу, поэтому «длинные» значения хранятся порезанными на
части. Из этих частей PostgreSQL прозрачно для приложения
«склеивает» необходимое значение.
Toastаблица используется только при обращении к «длинному»
значению. Кроме того, для toast-таблицы поддерживается своя
версионность: если обновление данных не затрагивает «длинное»
значение, новая версия строки будет ссылаться на то же самое
значение в toast-таблице. Это позволяет экономить место.
10
Итоги
Физически
данные распределены по табличным пространствам (каталогам)
объект представлен несколькими слоями
каждый слой состоит из одного или нескольких файлов-сегментов
Табличными пространствами управляет администратор
Слои, файлы, TOAST — внутренняя кухня PostgreSQL
11
Практика
1. Создайте новую базу данных и подключитесь к ней.
Создайте табличное пространство ts.
Создайте таблицу t в табличном пространстве ts
и добавьте в нее несколько строк.
2. Вычислите объем, занимаемый базой данных, таблицей
и табличными пространствами ts и pg_default.
3. Перенесите таблицу в табличное пространство pg_default.
Как изменился объем табличных пространств?
4. Удалите табличное пространство ts.