Вставка, удаление и обновление кортежей PostgreSQL
В этом разделе дается описание процесса вставки, удаления и обновления кортежей. Затем кратко описывается карта свободного пространства (FSM), структуры в PostgreSQL, предназначенной для быстрого поиска страницы c заданным количеством свободного места.
На рисунке ниже показан пример представления кортежей.
Вставка кортежей
С помощью операции вставки новый кортеж вставляется непосредственно в страницу целевой таблицы (рис. 51).
Предположим, что кортеж вставляется в страницу транзакцией, чей txid равен 99. В этом случае поля заголовка вставленного кортежа устанавливаются следующим образом.
Tuple_1:
- t_xmin устанавливается на 99, потому что этот кортеж вставлен с помощью txid 99;
- t_xmax устанавливается в 0, потому что данный кортеж не был ни удален, ни обновлен;
- t_cid устанавливается на 0, потому что данный кортеж является первым кортежем, вставленным с помощью txid 99;
- t_ctid устанавливается на (0,1), поскольку это самый последний кортеж.
Примечание: pageinspect
Модуль pageinspect предоставляет собой функции, позволяющие исследовать страницы баз данных на низком уровне, что бывает полезно для отладки. Все эти функции могут вызывать только суперпользователи.
testdb=# CREATE EXTENSION pageinspect;
CREATE EXTENSION
testdb=# CREATE TABLE tbl (data text);
CREATE TABLE
testdb=# INSERT INTO tbl VALUES('A');
INSERT 0 1
testdb=# SELECT lp as tuple, t_xmin, t_xmax, t_field3 as t_cid, t_ctid
FROM heap_page_items(get_raw_page('tbl', 0));
tuple | t_xmin | t_xmax | t_cid | t_ctid
-------+--------+--------+-------+--------
1 | 99 | 0 | 0 | (0,1)
(1 row)Удаление кортежей
При операции удаления целевой кортеж удаляется логически. Значение txid, выполняющего команду DELETE, устанавливается на t_xmax целевого кортежа (рис. 52).
Предположим, что кортеж Tuple_1 удаляется по идентификатору txid 111. В этом случае поля заголовка Tuple_1 будут установлены следующим образом:
Tuple_1:
- t_xmax утановлен на 111.
Если txid 111подтвержден, кортеж_1 больше не нужен. Ненужные кортежи в PostgreSQL называются «мертвыми» кортежами.
VACUUM высвобождает пространство, занимаемое «мёртвыми» кортежами. Более подробная информация предоставлена в разделе 6.
Обновление кортежей
При обновлении кортежа PostgreSQL логически удаляет последний кортеж и вставляет новый (рис. 53).
Предположим, что строка, которая была вставлена по txid 99, обновляется дважды по txid 100.
Когда выполняется первая команда UPDATE, Tuple_1 удаляется логически путем установки txid 100 в значение t_xmax, а затем добавляется Tuple_2. Затем переписывается t_ctid Tuple_1 для того, чтобы указать на Tuple_2. Поля заголовков Tuple_1 и Tuple_2 выглядят следующим образом:
Tuple_1:
- t_xmax устанавливается на 100.
- t_ctid переписывается из (0, 1) в (0, 2).
Tuple_2:
- t_xmin устанавливается на 100.
- t_xmax устанавливается на 0.
- t_cid устанавливается на 0.
- t_ctid устанавливается на (0,2).
При выполнении второй команды UPDATE, как и в первом случае, Tuple_2 удаляется логически и вставляется кортеж Tuple_3. Поля заголовков Tuple_2 и Tuple_3 выглядят следующим образом:
Tuple_2:
- t_xmax устанавливается на 100.
- t_ctid переписывается из (0, 2) в (0, 3).
Tuple_3:
- t_xmin устанавливается на 100.
- t_xmax устанавливается на 0.
- t_cid устанавливается на 1.
- t_ctid устанавливается на (0,3).
Как и в случае с операцией удаления, если операция txid 100 выполнена, то Tuple_1 и Tuple_2 становятся «мертвыми» кортежами. Если операция txid 100 будет прервана, то Tuple_2 и Tuple_3 также становятся «мертвыми» кортежами.
Карта свободного пространства
Карта свободного пространства (free space map или FSM) - слой отношения, состоящий из FSM страниц, которые помогают быстро найти страницу из основного слоя для записи новой версии строки. FSM файлы, представляющие собой сегменты максимум по 1 гб, лежат вместе с файлами других слоев.
Подобно карте видимости, карта свободного пространства хранится в отдельном форке. Если таблица имеет relfilenode равный 16393, то FSM будет лежать рядом, в файле с именем 16393_fsm. FSM строится для кучи, а также для всех индексов, кроме hash-индекса. У каждой таблицы и каждого индекса свой отдельный FSM..
Примечание: pg_freespacemap
Модуль pg_freespacemap предоставляет средства для исследования карты свободного пространства (FSM). В нём реализована функция pg_freespace , точнее, две перегруженных функции. Эти функции показывают значение, записанное в карте свободного пространства для данной страницы, либо для всех страниц отношения.
testdb=# CREATE EXTENSION pg_freespacemap;
CREATE EXTENSION
testdb=# SELECT *, round(100 * avail/8192 ,2) as "freespace ratio"
FROM pg_freespace('accounts');
blkno | avail | freespace ratio
-------+-------+-----------------
0 | 7904 | 96.00
1 | 7520 | 91.00
2 | 7136 | 87.00
3 | 7136 | 87.00
4 | 7136 | 87.00
5 | 7136 | 87.00
....







