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