Знание внутреннего устройства СУБД позволяет использовать возможности базы данных по максимуму. Устройство PostgreSQL в целом достаточно подробно документировано, однако с некоторыми аспектами работы до сих пор можно ознакомиться, только изучая исходный код. Так, например, в ряде работ наглядно показано, каким образом PostgreSQL хранит записи, упаковывая их в страницы, и как страницы уложены в хранилище, но нигде не рассказано о внутреннем устройстве самих данных записи. Данный доклад призван восполнить этот пробел.
Для достижения поставленной задачи было модифицировано расширение PostgreSQL pageinspect таким образом, чтобы пользователь мог получить прямой доступ к данным записи в том виде, в котором они хранятся на диске или в памяти. Получив таким образом возможность изучать структуры данных напрямую, а также в некоторой степени опираясь на исходный код, в этом докладе мы рассмотрим:
- как именно запись разделяется на атрибуты;
- как хранятся атрибуты разного типа, чем отличаются атрибуты фиксированной и переменной длины;
- рассмотрим разные способы упаковки атрибутов переменной длины;
- поговорим об особенностях хранения NULL значений;
- уделим внимание такой теме как "выравнивание" и тому, как происходит выравнивание атрибутов в записи PostgreSQL;
- для сверхдлинных атрибутов переменной длины рассмотрим механизмы компрессии и выноса значения во внешнее хранилище (TOAST).
После получения полного представления о том, как запись устроена изнутри, мы поговорим о том, как это знание можно использовать для того, чтобы сделать базу данных более эффективной: уменьшить потребление дискового пространства и увеличить скорость доступа к значениям записи.