TGViewer
SQL Portal | Базы Данных SQL Portal | Базы Данных @sqlportal · 13.9K subscribers
Post #1570 2.14K
PostgreSQL делает одну хитрую оптимизацию, из-за которой некоторые сканы становятся index-only и запрос выполняется быстрее. Вот как это работает…

Index-only scan это когда PostgreSQL забирает данные полностью из индекса, не обращаясь к реальным строкам таблицы (heap). Это сильно быстрее, потому что убирается лишний шаг чтения строк с диска.

Чтобы index-only scan реально работал, PostgreSQL должен быть уверен, что данные в индексе актуальны. Из-за реализации MVCC одна и та же строка может существовать в нескольких версиях, которые используются разными активными транзакциями.

В не оптимизированном варианте PostgreSQL пришлось бы читать реальную строку, чтобы проверить ее видимость (visibility) и при необходимости взять последнюю версию. Из-за этого index-only scans могут быть не такими быстрыми, как хотелось бы. Чтобы ускорить это, PostgreSQL использует Visibility Map.

Visibility Map это внутренняя структура данных, которую PostgreSQL ведет, чтобы отслеживать, какие страницы (блоки строк) в таблице содержат только такие tuple (строки), которые видимы всем транзакциям. Если страница помечена в visibility map как all-visible, движок понимает, что ему не нужно проверять видимость отдельных строк на этой странице.

Поэтому во время index-only scan PostgreSQL сначала вычисляет строки, которые должны попасть в результат, а потом смотрит в visibility map, помечена ли соответствующая страница как all-visible. Если да, он пропускает чтение этой страницы из heap, и выполнение становится быстрее и эффективнее.

В PostgreSQL из-за MVCC операции update и delete приводят к появлению dead tuples, и чтобы их очистить, нужен vacuum. Поэтому в процессе vacuuming:

1. удаляются dead tuples, и
2. обновляется visibility map, чтобы пометить страницы как all-visible.

Это означает, что каждая строка на этой странице видима всем транзакциям, и теперь можно пропускать heap fetch и выполнять index-only scans быстрее.

👉 @SQLPortal
  • 👍 5
  • 🔥 3
More from @sqlportal
  1. Oct 14, 2026Числовые функции SQL: от округления до итогов 🔢 Они помогают обрабатывать числа и выполня…
  2. Oct 13, 2026Быстрый SQL начинается с продуманных запросов 1. Выбирайте только нужные столбцы. Вместо S…
  3. Oct 13, 2026SQL помогает получить данные. Статистика — понять, что они означают 20 статистических поня…
  4. Oct 12, 2026Команды SQL проще запомнить по назначению • DDL — создание и изменение структуры БД: CREAT…
  5. Oct 12, 2026Pandas: Python для повседневных задач аналитика 🐼 Загрузить файлы с неаккуратными данными…
  6. Oct 11, 2026Чтобы запросы оставались быстрыми, понятными и справлялись с ростом объёма данных, нужны х…
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 →