Этой статьей я начинаю новую серию статей о Postgres и его внутренностях. Я планирую написать ее организованно, структурированно и очень кратко.
Полный список моей серии Postgres 15 Internals вы можете найти здесь.
Я собираюсь начать с организации данных и описания того, как данные хранятся на диске. И будет продолжена изоляция, управление версиями, буферный кеш, блокировки, обработка запросов и индексы. Если вам интересно — добро пожаловать!
Базы данных
PostgreSQL — это программа типа управления базами данных. Когда эта программа запущена, мы называем ее сервером PostgreSQL или экземпляром сервера.
данные, которыми управляет PostgreSQL, хранятся в базах данных. Экземпляр сервера работает с несколькими базами данных одновременно, что называется кластером баз данных.
Перед использованием кластера базы данных его необходимо инициализировать (создать). Каталог, в котором хранятся все файлы кластера, обычно называется PGDATA в соответствии с переменной среды, которая указывает на него.
В процессе инициализации создаются три одинаковые базы данных:
- template0 —используется для восстановления из зарезервированной копии или для создания базы данных в другой кодировке, никогда не должен изменяться;
- template1 —используется как шаблон для остальных баз данных, которые могут быть созданы пользователем;
- postgres — простая база данных, которую можно использовать для работы;
Системный каталог
Вся информация, связанная с метаданными кластера (метаданные, относящиеся к таблицам, индексам, типам данных и индексам), хранится в системном каталоге. В каждой базе данных хранится собственный набор таблиц (и представлений), описывающих собственные объекты. Также в системном каталоге есть несколько таблиц, общих для всех баз данных, но доступных из любой.
Доступ к системному каталогу можно получить с помощью обычных запросов SQL и изменить с помощью DDL. Клиент psql имеет набор команд для работы с системным каталогом.
Все имена таблиц в системном каталоге начинаются с префикса pg_, например, pg_database. Имена столбцов начинаются с трехбуквенного кода, описывающего имя таблицы, например, имя_данных.
Все таблицы системного каталога имеют столбцы первичного ключа с именем oid, имеющие тип с тем же именем oid (идентификатор объекта).
Схемы
Схемы — это пространства имен для всех объектов, хранящихся в базе данных. Помимо определяемых пользователем схем, в базе данных есть несколько специальных:
- public — используется по умолчанию для пользовательских объектов;
- pg_catalog — используется для таблиц системного каталога;
- information_schema — представление системного каталога, определяемое стандартами SQL;
- pg_toast — используется для объектов TOAST;
- pg_temp — хранит временные таблицы (примечание: у каждого пользователя своя схема для временных таблиц: pg_temp_N, но pg_temp используется как псевдоним для каждого из тех);
Все схемы хранятся внутри баз данных, а все объекты хранятся внутри схем. Если имя схемы не указано явно, из пути поиска выбирается первая совпадающая схема. Путь поиска создается на основе значения, хранящегося в параметре search_path, схемах pg_catalog и pg_temp. Это позволяет пользователю хранить объекты с одинаковыми именами, но в разных схемах.
Табличные пространства
Помимо логического порядка, табличные пространства определяют физическое расположение данных. Фактическое табличное пространство — это каталог файловой системы. Например, вы можете разместить архивные данные на медленном жестком диске, а горячие данные — на быстром SDD.
Одно и то же табличное пространство может использоваться несколькими базами данных одновременно. И одна база данных может хранить свои данные в нескольких табличных пространствах. Это означает, что логическая и физическая структуры независимы.
Каждая база данных имеет собственное табличное пространство по умолчанию. Он используется для создания каждого объекта, если значения по умолчанию не изменены. В нем также хранятся объекты системного каталога.
При инициализации кластера создаются два табличных пространства:
- pg_default — находится в PGDATA/base и используется как табличное пространство по умолчанию для всех баз данных;
- pg_global — находится в PGDATA/global и хранит общие объекты для всего системного каталога кластера;
При создании используемого табличного пространства может быть указан любой каталог файловой системы. PostgreSQL создает символическую ссылку на указанный каталог в PGDATA/pg_tblspc. Кстати, все пути PostgreSQL относительны и вычисляются из PGDATA. Это позволяет вам перемещать PGDATA куда угодно.
связи
Наиболее важными объектами базы данных являются таблицы и индексы, состоящие из строк. Очевидно, что таблицы содержат строки, но узлы B-дерева также содержат строки. Есть и другие объекты, содержащие строки: последовательности (это просто таблицы с одним столбцом), материализованные представления (то же, что и таблицы) и простые представления (они ничего не хранят, кроме строк).
Все описанные выше объекты называются отношениями.
В этой статье мы описали основы структуры базы данных PostgreSQL, дали определения наиболее важным объектам и определили (наиболее важные) отношения.
В следующей статье мы поговорим о структуре файлов БД и их слоях.
Полный список статей — здесь.
Спасибо за чтение!
Рекомендации
PostgreSQL 15 изнутри. — М.: ДМК Пресс, 2023. — 662 с. ISBN 978–5-93700–178–8