Веб-версияОткрыть в Telegram

ПостCOUNT(*) в PostgreSQL: MVCC, visibility map и стоимость выполнения!

5 октября 2026
S
SQL Ready | Базы Данных
COUNT(*) в PostgreSQL: MVCC, visibility map и стоимость выполнения! В PostgreSQL точный COUNT(*) требует определить количество строк, видимых текущему MVCC snapshot. Глобального счётчика, который можно было бы использовать для транзакционно корректного результата, у таблицы нет: SELECT COUNT(*) FROM orders; На большой таблице планировщик часто выбирает Seq Scan, поскольку для точного результата всё равно требуется обработать множество видимых строк: Aggregate -> Seq Scan on orders Наличие PRIMARY KEY или другого подходящего индекса не гарантирует его использование. Если модель стоимости считает путь через индекс дешевле, PostgreSQL может выполнить запрос через Index Only Scan: Aggregate -> Index Only Scan using orders_pkey on orders Однако Index Only Scan не означает получение готового количества записей из индекса. Информация, необходимая для определения MVCC-видимости строк, находится в heap, а не в самом индексе. PostgreSQL оптимизирует эту проверку с помощью visibility map. Если страница отмечена как all-visible, PostgreSQL может считать находящиеся на ней строки видимыми без дополнительного обращения к heap: EXPLAIN (ANALYZE, BUFFERS) SELECT COUNT(*) FROM orders; После изменения страницы её флаг all-visible сбрасывается и впоследствии может быть снова установлен VACUUM. Поэтому на активно изменяемых таблицах даже Index Only Scan может требовать дополнительных обращений к heap: Index Only Scan using orders_pkey on orders Heap Fetches: 18427 Таким образом, производительность COUNT(*) зависит не только от размера таблицы и наличия индекса, но и от состояния visibility map, характера нагрузки, работы autovacuum, выбранного плана выполнения и состояния кэша PostgreSQL. Если транзакционно точное количество строк не требуется, можно использовать статистическую оценку из pg_class: SELECT reltuples::bigint FROM pg_class WHERE oid = 'orders'::regclass; reltuples обновляется, в частности, при VACUUM и ANALYZE и остаётся приблизительной оценкой. Если статистика для таблицы ещё не собиралась, значение может быть -1. 🔥 Для больших таблиц это принципиально разные варианты: полный MVCC-корректный подсчёт или быстрое получение приблизительной статистической оценки. ➡️ SQL Ready | #практика
15 · 744 ·

Рядом в ленте

SSQL Ready | Базы ДанныхПроверяйте JSON без преобразования! Если JSON приходит как text, необязательно делать ::jsonb и ловить ошибку преобразования. IS JSON просто вернёт true или falSSQL Ready | Базы ДанныхКак оплачивать зарубежные сервисы в 2026 году? Можно бегать между посредниками и бояться блокировок после оплаты, а можно выпустить международную карту Lumio Pa
это сообщение
SSQL Ready | Базы Данных👍 Устройство PostgreSQL — подробная документация на русском языке! Материалы посвящены не написанию SQL-запросов, а архитектуре СУБД и внутренним механизмам обрSSQL Ready | Базы Данных⚡️5 фундаментальных курсов по ИБ по цене одного Это предложение для тех, кто готов войти в новую профессию прямо сейчас! 🔥Пакет курсов за 50 000 ₽ вместо 250 00
SSQL Ready | Базы ДанныхSQL Ready | Базы Данных@sql_ready · канал · Технологии
17 479подписчиков1 890средний охват поста
Лента площадки Открыть в Telegram

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Чего мы не делаем · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем