Организация данных
Физическая структура
12
Авторские права
© Postgres Professional, 2017–2020
Авторы: Егор Рогов, Павел Лузанов
Использование материалов курса
Некоммерческое использование материалов курса (презентации,
демонстрации) разрешается без ограничений. Коммерческое
использование возможно только с письменного разрешения компании
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/ соответственно. При
создании пользовательского ТП указывается произвольный каталог;
для собственного удобства PostgreSQL создает на него символьную
ссылку в каталоге 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.