TGViewer
SQL Portal | Базы Данных SQL Portal | Базы Данных @sqlportal · 14K subscribers
Post #1536 2.39K
Строки в PostgreSQL неизменяемые и хранятся в heap. У каждой строки есть скрытый идентификатор CTID, который указывает на ее физическое местоположение на диске.

CTID это идентификатор-кортеж из двух частей: номер страницы и индекс (позиция) внутри этой страницы. Посмотреть его можно простым запросом:

SELECT ctid, * FROM your_table;


Вывод будет выглядеть примерно так: (0,1), (0,2), (1,1), где первое число это страница, а второе это позиция.

Что в CTID интересного: когда ты создаешь индекс по первичному ключу, индекс не хранит всю строку целиком. Он хранит значение ключа и CTID, который указывает на реальное место строки в heap.

Из-за этого выборки быстрые. Индекс дает CTID, и PostgreSQL прыгает напрямую в нужную физическую точку в heap, чтобы достать строку.

Но есть нюанс: CTID меняется при обновлении строки. PostgreSQL использует MVCC (Multi-Version Concurrency Control), поэтому update создает новую версию строки в другом физическом месте. Старый CTID становится невалидным, а у строки появляется новый.

Из-за этого индексы нужно обновлять при каждом обновлении строки. Значение ключа может остаться тем же, но CTID, на который оно указывает, меняется.

Интересные архитектурные решения. PostgreSQL сэкономил одно лишнее разыменование, сохраняя CTID, но теперь индекс нужно переписывать даже если меняются неиндексируемые колонки.

Вот почему я обожаю копаться во внутренностях СУБД :) Там сплошь интересные решения и компромиссы.

👉 @SQLPortal
  • 👍 11
  • ❤ 1
More from @sqlportal
  1. Oct 16, 2026💬👨‍💻🐍💩🤖🤖🐧👩‍💻🧑‍💻👋🦀 Дождались! Ребята сделали крутейший канал про IT новой эпо…
  2. Oct 16, 2026Практические уроки для Backend, Data Engineering и DevOps Площадка с пошаговыми туториалам…
  3. Oct 15, 2026SQL проще изучать, если разделить его по задачам • Определять структуру таблиц: CREATE, AL…
  4. Oct 15, 2026Git пригодится и тем, кто пишет SQL Храните запросы, миграции и схемы БД в репозитории: та…
  5. Oct 14, 2026Дубликаты в SQL: способ зависит от задачи • DISTINCT убирает повторяющиеся сочетания выбра…
  6. Oct 14, 2026Числовые функции SQL: от округления до итогов 🔢 Они помогают обрабатывать числа и выполня…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →