В тази статия ще говорим за организацията на PostgreSQL във файлове и техните разклонения. Ако не сте чели предишните статии, силно препоръчвам да го направите. Пълният списък на моята серия Postgres 15 Internals можете да намерите тук.

Вилици и пили

Информацията, свързана с релациите, е организирана в няколко разклонения(слоеве) от различен тип. Всяко разклонение съдържа определен тип данни.

От самото начало разклонението се отразява физически като един файл във файлова система. Името на файла се състои от цифров идентификатор (iod) и наставка, която отразява типа fork.

С течение на времето файлът расте и когато размерът му достигне 1GB, се създава още един файл за същия разклон (файловете на същия разклон обикновено се наричат ​​сегменти) . Поредният номер на сегмент се добавя в края на файла като суфикс.

Ограничението за размер на файла от 1 GB съществува поради исторически причини за поддръжка на различни файлови системи (някои от тях не могат да работят с файлове, които са повече от 1 GB). Може да се променя само по време на процеса на компилиране и изграждане на PostgreSQL със специално свойство (./configure — with-segsize).

Според казаното по-горе, една връзка има няколко файла във файлова система. Например, дори малка таблица без индекси има три файла, по един на разклонение.

Поддиректориите се създават за всяка отделна база данни в директория на таблично пространство (с изключение на pg_global). Всички обектни файлове, принадлежащи към едно и също таблично пространство и една и съща база данни, се съхраняват в една и съща директория. Трябва да вземете предвид този факт, тъй като някои файлови системи не работят добре с голямо количество файлове в една и съща директория.

Има няколко типа вилици по подразбиране.

Главна вилица

Това са самите данни. Той съдържа таблицата или индексните редове. Главното разклонение съществува за всяка релация с изключение на прости изгледи (тъй като те не съхраняват никакви данни).

Главните разклонителни файлове са направени само от цифров идентификатор (той е равен на стойността, съхранена в колоната relfilenodeв таблицата pg_class).

Да дадем пример:

public> CREATE UNLOGGED TABLE t
                 (
                     a integer,
                     b numeric,
                     c text,
                     d json
                 );
public> INSERT INTO t
        VALUES (1, 2.0, 'foo', '{}');
public> SELECT pg_relation_filepath('t')

> base/5/16407

Директорията с име base принадлежи на табличното пространство pg_default, следващата поддиректория (5) принадлежи на базата данни и вътре в нея виждаме файла с таблицата (16407):

public> SELECT oid FROM pg_database WHERE datname = 'postgres';

> 5

public> SELECT relfilenode FROM pg_class WHERE relname = 't';

> 16407

И можем да проверим размера на файла във файловата система:

public> SELECT size FROM pg_stat_file('base/5/16407');

> 8192

Инициализиране на вилица

Това разклонение съществува само за нерегистрирани таблици (създадени с ключова дума UNLOGGED) и техните индекси. Такива обекти са абсолютно същите като другите, с изключение на един факт — всички действия, които се извършват с такива обекти, не се записват в WAL (журнал за предварително записване). Така че работният процес се случва по-бързо с такива обекти, но в случай на повреда данните не могат да бъдат възстановени по последователен начин. PostgreSQL просто изтрива всички разклонения на такива обекти, в случай на възстановяване, и записва init разклонения в главния разклонител. В резултат на процеса на възстановяване имаме празен обект.

Таблицата t от примера по-горе се създава без регистрация. Така че има разклонение за стартиране. Има същото име като основното разклонение, но със суфикс _init:

public> SELECT size FROM pg_stat_file('base/5/16407_init')

>0

Карта на свободното пространство

Това е разклонение, което съдържа приблизителна информация за свободното пространство в страниците. Размерът на свободното пространство се променя много често: когато се добавят нови версии на редове - той се увеличава, когато се изтриват - намалява. Картата на свободното пространство се използва при вмъквания на нови версии на редове, за да е възможно много бързо намиране на страница за нови данни.

Имената на файловете на картата на свободното пространство имат суфикс _fsm. Но файловете се създават само когато е необходимо. Най-лесният начин да задействате създаването на файл е просто да почистите таблица:

public> VACUUM t;
public> SELECT size FROM pg_stat_file('base/5/16407_fsm')

>24576

За да подобри процеса на търсене, картата на свободното пространство е организирана като дърво и заема най-малко три страници дисково пространство (обяснява размера на файла на разклонението на свободна маса).

Съществува карта на свободното пространство и за индекси. Но е невъзможно да добавите индексен ред на произволна страница (например за B-дърво страницата се изчислява според метода на сортиране). Така че картата на свободното пространство съдържа напълно чисти страници, които могат да се използват само повторно.

Карта на видимостта

Това е разклонение, което ви позволява много бързо да разберете дали дадена страница изисква почистване или замразяване. И така, той съдържа два бита на страница на таблица за тези цели.

Първият бит е флаг, отразяващ дали страницата съдържа само действителни версии на редове. Процесът на почистване пропуска такива страници, защото не съдържат нищо за премахване. Освен това, когато транзакция се опитва да прочете ред от такава страница, тя може да не провери нейната видимост и да използва само сканиране на индекс.

Вторият бит е флаг, който показва страница, която съдържа само замразени редове. Тази част от разклона се нарича замразена карта (или замразена карта).

Fork файлът има име, съдържащо суфикса _vm. Такива разклонения заемат малко дисково пространство:

public> SELECT size FROM pg_stat_file('base/5/16407_vm');

>8192

Съществува карта на видимост за таблици, но не и за индекси.

В тази статия говорихме за вилиците. Как се съхраняват и как се организират. В следващата статия ще разгледаме страниците и технологията TOAST.

Благодаря ви, че прочетохте!

Препратки

PostgreSQL 15 извътре. — М.: ДМК Прес, 2023. — 662 с. ISBN 978–5–93700–178–8