8
ctid ключ
Индексные записи
ctidxmin xmax данные
xmin committed
xmin aborted
xmax committed
xmax aborted
heap hot upd
heap only tuple
(0,2)
(0,1)
статус
(0,2)(0,2)
(0,1)
(0,2)
указатель на версию
строки в таблице
значения ключей
индексирования
Информация в индексной странице сильно зависит от типа индекса.
И даже у одного типа индекса бывают разные виды страниц. Например,
у B-дерева есть страница с метаданными и «обычные» страницы.
Тем не менее, обычно в странице имеется массив указателей и строки
(так же, как и в табличной странице). Во избежание путаницы мы будем
называть индексные строки записями. Кроме того, в конце индексной
страницы отводится место под специальные данные.
Индексные записи тоже могут иметь очень разную структуру
в зависимости от типа индекса. Например, для B-дерева записи,
относящиеся к листовым страницам, содержат значение ключа
индексирования и ссылку (ctid) на соответствующую строку таблицы
(подробно структура B-дерева разбирается в учебном курсе QPT
«Оптимизация запросов»).
В общем случае индекс может быть устроен совсем другим образом,
но как правило он все равно будет содержать ссылки на версии строк.
Номера ctid имеют вид (x,y): здесь x — номер страницы, y —
порядковый номер указателя в массиве. Для удобства мы будем
показывать номера слева от указателей на табличные версии строк.
Важный момент состоит в том, что никакой индекс не содержит
информацию о версионности (нет полей xmin и xmax). Прочитав
индексную запись, невозможно определить видимость строки, на
которую она ссылается, не заглянув в табличную страницу. Для
оптимизации этой проверки служит карта видимости.
На рисунке показаны записи обычного индекса-B-дерева. Для простоты
указатели на эти записи опущены.