Методы записи и чтения кортежей PostgreSQL
В данном разделе описаны методы записи и чтения кортежей.
Запись кортежей
Предположим, таблица состоит из одной страницы, которая содержит только один кортеж. pd_lower этой страницы указывает на первый указатель строки, pd_upper указывают на первый кортеж. Смотрите рисунок 5.
Когда добавляется второй кортеж, он располагается после первого. Второй указатель строки добавляется к первому и указывает на второй кортеж. Значение pd_lower меняетсяся на указатель второй строки, а pd_upper - на второй кортеж. Смотрите рисунок 5. Другие данные заголовка страницы (например, pd_lsn, pg_checksum, pg_flag) также обновляются до соответствующих значений; более подробно об этом говорится в разделе 5.3 и разделе 9.4.
Чтение кортежей
Здесь описаны два типичных метода доступа, последовательное сканирование и сканирование по индексу B-дерева:
-
Последовательное сканирование – самый эффективный способ прочитать всю таблицу или значительную ее часть. Оно последовательно считывает все кортежи на всех страницах, сканируя все указатели строк на каждой странице. Смотрите рисунок 6.
-
Сканирование по индексу B-дерева – данный метод считывает индексный файл, содержащий индексные кортежи, каждый из которых состоит из индексного ключа и TID, указывающего на целевой кортеж.
Если индексный кортеж с искомым ключом найден, PostgreSQL считывает нужный кортеж, используя полученное значение TID. Например, на рисунке 6 значение TID полученного индексного кортежа равно '(block = 7, Offset = 2)'. Это означает, что целевой кортеж - это 2-й кортеж в 7-й странице таблицы, поэтому PostgreSQL может прочитать нужный кортеж без дополнительного сканирования страниц.
Примечание:
Данное руководство не содержит подробного описания индексов. Детальная информация по данной теме представлена в следующих постах:
- Индексы в PostgreSQL – 1
- Индексы в PostgreSQL – 2
- Индексы в PostgreSQL – 3 (Хэш)
- Индексы в PostgreSQL – 4 (B-дерево)
- Индексы в PostgreSQL – 5 (GiST)
- Индексы в PostgreSQL – 6 (SP-GiST)
- Индексы в PostgreSQL – 7 (GIN)
- Индексы в PostgreSQL – 9 (GIN)
Примечание:
PostgreSQL также поддерживает возможность сканирования TID-Scan, Bitmap-Scan и Index-Only-Scan.
TID-Scan - это метод, который обращается к кортежу напрямую, используя TID искомого кортежа. Например, чтобы найти 1-й кортеж на 0-й странице таблицы, необходимо выполнить следующий запрос:
sampledb=# SELECT ctid, data FROM sampletbl WHERE ctid = '(0,1)'; ctid | data -------+----------- (0,1) | AAAAAAAAA (1 row)
Подробное описание Index-Only-Scan Вы найдете в подразделе 7.2.





