06 Занятие 06: Организация данных / Физическая структура
Эта страница извлечена из официального PDF в нативный Markdown. Текст слайдов, код и комментарии сохранены в порядке чтения; исходные PDF и HTML остаются эталоном макета. HTML source: dev1_06_data_physical.html Archive: DEV1-handouts-16.zip Страниц PDF: 15
Page 1: Организация данных / Физическая структура
Авторские права
© Postgres Professional, 2017–2024 Авторы: Егор Рогов, Павел Лузанов, Илья Баштанов, Игорь Гнатюк Фото: Олег Бартунов (монастырь Пху и пик Бхрикути, Непал)
Использование материалов курса
Некоммерческое использование материалов курса (презентации, демонстрации) разрешается без ограничений. Коммерческое использование возможно только с письменного разрешения компании Postgres Professional. Запрещается внесение изменений в материалы курса.
Обратная связь
Отзывы, замечания и предложения направляйте по адресу: edu@postgrespro.ru
Отказ от ответственности
Компания Postgres Professional не несет никакой ответственности за любые повреждения и убытки, включая потерю дохода, нанесенные прямым или непрямым, специальным или случайным использованием материалов курса. Компания Postgres Professional не предоставляет каких-либо гарантий на материалы курса. Материалы курса предоставляются на основе принципа «как есть» и компания Postgres Professional не обязана предоставлять сопровождение, поддержку, обновления, расширения и изменения.
Page 2: Темы
- Табличные пространства и каталоги
- Файлы и страницы данных
- Слои: данные, карты видимости и свободного пространства
- Технология TOAST
Page 3: Табличные пространства
{#source-figure-003 caption=“Source slide page 3: Табличные пространства”}
Комментарии преподавателя
Табличные пространства (ТП) служат для организации физического хранения данных и определяют расположение данных в файловой системе.
Например, можно создать одно ТП на медленных дисках для архивных данных, а другое – на быстрых дисках для данных, с которыми идет активная работа.
При инициализации кластера создаются два ТП: pg_default и pg_global.
Одно и то же ТП может использоваться разными базами данных, а одна база данных может хранить данные в нескольких ТП.
При этом у каждой БД есть так называемое «ТП по умолчанию», в котором создаются все объекты базы, если явно не указать иное. В этом же ТП хранятся и объекты системного каталога. Изначально в качестве «ТП по умолчанию» используется ТП pg_default, но можно установить и другое.
ТП pg_global особенное: в нем хранятся те объекты системного каталога, которые являются общими для кластера.
Page 4: Каталоги
{#source-figure-004 caption=“Source slide page 4: Каталоги”}
Комментарии преподавателя
По сути, табличное пространство — это указание на каталог, в котором располагаются данные. Стандартные ТП pg_global и pg_default всегда находятся в PGDATA/global/ и PGDATA/base/ соответственно. При создании пользовательского ТП указывается произвольный каталог; для собственного удобства PostgreSQL создает на него символьную ссылку в каталоге PGDATA/pg_tblspc/.
Внутри каталога PGDATA/base/ данные дополнительно разложены по подкаталогам баз данных (для PGDATA/global/ это не требуется, так как данные в нем относятся к кластеру в целом).
Внутри каталога пользовательского ТП появляется еще один уровень вложенности: версия сервера PostgreSQL. Это сделано для удобства обновления сервера на другую версию.
Собственно объекты хранятся в файлах внутри этих каталогов — каждый объект размещается в одном или нескольких файлах.
Каждый такой файл, называемый сегментом, занимает по умолчанию не более 1 Гбайт (этот размер можно изменить при сборке сервера). В том числе поэтому каждому объекту может соответствовать несколько файлов. Необходимо учитывать влияние потенциально большого количества файлов на используемую файловую систему.
https://postgrespro.ru/docs/postgresql/16/storage-file-layout
Page 5: Использование табличных пространств
Изначально в кластере присутствуют два табличных пространства. Информация о них содержится в системном каталоге:
Конечно, это одна из глобальных для всего кластера таблиц. Аналогичная команда psql:
Для нового табличного пространства нужен пустой каталог, владельцем которого является пользователь ОС, запускающий сервер СУБД:
Сменим владельца каталога:
Теперь можем выполнить команду создания табличного пространства:
При создании базы данных можно указать табличное пространство по умолчанию:
Это означает, что все объекты базы по умолчанию будут создаваться в этом табличном пространстве.
Page 6: Слои и файлы
{#source-figure-006 caption=“Source slide page 6: Слои и файлы”}
Основной
- собственно данные
- Карта свободного пространства
- в страницах после
- очистки
- Карта видимости
- отмечает страницы,
- на которых все
- версии строк
- видны во всех снимках
Комментарии преподавателя
Обычно каждому объекту соответствует несколько слоев (forks). Каждый слой — это набор сегментов (то есть один или несколько файлов). Файлы-сегменты, из которых состоят слои, логически разбиты на страницы, обычно по 8 Кбайт (этот размер можно установить для всего кластера только при сборке сервера). Страницы файлов всех слоев объектов считываются с диска совершенно однотипно через общий механизм буферного кеша. Сами слои содержат разную информацию и имеют разное внутреннее устройство страниц.
Основной слой — это собственно данные: версии строк таблиц или строки индексов.
Слой vm (visibility map) — битовая карта видимости. В ней отмечены страницы, которые содержат только актуальные версии строк, причем эти версии видны во всех снимках данных. Такие страницы давно не изменялись и успели полностью очиститься от неактуальных версий.
Карта видимости применяется для оптимизации очистки (отмеченные страницы не нуждаются в очистке) и для ускорения индексного доступа. Информация о версионности строк хранится только для таблиц, но не для индексов. Поэтому, получив из индекса ссылку на версию строки, нужно проверить ее видимость, обратившись к табличной странице. Но если в самом индексе уже есть все нужные столбцы, а страница отмечена в карте видимости, то к таблице можно не обращаться.
Слой fsm (free space map) — карта свободного пространства. В ней отмечено доступное место внутри страниц, образующееся, например, при работе очистки. Эта карта используется при вставке новых версий строк для того, чтобы быстро найти подходящую страницу.
Page 7: Слои и файлы
Очистка обеспечит нам создание всех слоев таблицы:
Узнать расположение файлов, из которых состоит объект, можно так:
Посмотрим на сами файлы (имя и размер в байтах):
Видно, что они относятся к трем слоям: основному, fsm и vm. Объекты можно перемещать между табличными пространствами, но (в отличие от схем) это приводит к физическому перемещению данных:
Размер объектов
Узнать размер, занимаемый базой данных и объектами в ней, можно с помощью ряда функций.
Для упрощения восприятия можно вывести число в отформатированном виде:
Полный размер таблицы (вместе со всеми индексами):
А также отдельно размер таблицы…
Page 8: Page 8
…и индексов:
При желании можно узнать и размер отдельных слоев таблицы, например:
Объем, который занимает на диске табличное пространство, показывает другая функция:
Page 9: TOAST
Версия строки должна помещаться на одну страницу
- можно сжать часть атрибутов,
- или вынести в отдельную TOAST-таблицу,
- или сжать и вынести одновременно
- TOAST-таблица
- схема pg_toast
- поддержана собственным индексом
- «длинные» атрибуты разделены на части размером меньше страницы
- читается только при обращении к «длинному» атрибуту
- собственная версионность
- работает прозрачно для приложения
Комментарии преподавателя
Любая версия строки в PostgreSQL должна целиком помещаться на одну страницу. Для «длинных» версий строк применяется технология TOAST — The Oversized Attributes Storage Technique. Она подразумевает несколько стратегий. Подходящий «длинный» атрибут может быть сжат так, чтобы версия строки поместилась на страницу. Если это не получается, атрибут может быть отправлен в отдельную служебную таблицу. Могут применяться и оба подхода.
Для каждой основной таблицы при необходимости создается отдельная toast-таблица (и к ней специальный индекс). Такие таблицы и индексы располагаются в отдельной схеме pg_toast и поэтому обычно не видны.
Версии строк в toast-таблице тоже должны помещаться на одну страницу, поэтому «длинные» значения хранятся порезанными на части. Из этих частей PostgreSQL прозрачно для приложения «склеивает» необходимое значение.
Toast-таблица используется только при обращении к «длинному» значению. Кроме того, для toast-таблицы поддерживается своя версионность: если обновление данных не затрагивает «длинное» значение, новая версия строки будет ссылаться на то же самое значение в toast-таблице — это экономит место.
https://postgrespro.ru/docs/postgresql/16/storage-toast
Page 10: TOAST
Добавим в таблицу очень длинную строку:
Изменится ли размер таблицы?
Да. А размер основного слоя, в котором хранятся данные?
Нет. Поскольку версия строки не помещается в одну страницу, значение атрибута s будет разрезано на части и помещено в отдельную toast-таблицу. Ее можно отыскать в системном каталоге (мы используем тип regclass, чтобы преобразовать oid в имя отношения):
Символьная строка хранится по частям, из которых PostgreSQL при необходимости склеивает полное значение:
В заключение удалим базу данных.
После того, как в табличном пространстве не осталось объектов, можно удалить и его:
Page 11: Page 11
Page 12: Итоги
Физически
- данные распределены по табличным пространствам (каталогам)
- объект представлен несколькими слоями
- каждый слой состоит из одного или нескольких файлов-сегментов
- Табличными пространствами управляет администратор
- Слои, файлы, TOAST — внутренняя кухня PostgreSQL
Page 13: Практика
- Создайте новую базу данных и подключитесь к ней. Создайте табличное пространство ts. Создайте таблицу t в табличном пространстве ts и добавьте в нее несколько строк. 2. Вычислите объем, занимаемый базой данных, таблицей и табличными пространствами ts и pg_default. 3. Перенесите таблицу в табличное пространство pg_default. Как изменился объем табличных пространств? 4. Удалите табличное пространство ts.
Page 14: 1. Табличные пространства и таблица
Создаем базу данных:
Табличное пространство:
Создаем таблицу:
2. Размер данных
Объем базы данных:
Размер таблицы:
Объем табличных пространств:
Размер табличного пространства больше размера таблицы на 4kB из-за особенностей вычисления размера содержимого каталога в Linux.
3. Перенос таблицы
Перенесем таблицу:
Новый объем табличных пространств:
Page 15: 4. Удаление табличного пространства
Удаляем табличное пространство…
…и каталог, где были размещены его данные: