Этой статьей я начинаю новую серию статей о 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