Почему Index Only Scan не всегда означает «без чтения таблицы» — 13 июля 2026 г. в 16:05:00.801
Почему Index Only Scan не всегда означает «без чтения таблицы» Фрагмент фактического плана: Index Only Scan ... Heap Fetches: 184320 Покрывающий индекс добавили. План стал выглядеть лучше. Но запрос ускорился не так сильно, как ожидали. Причина может быть в Heap Fetches. PostgreSQL может выбрать Index Only Scan, если нужные данные есть в индексе. Но из-за MVCC ему всё равно нужно понять, видима ли строка текущему запросу. Для этого проверяется visibility map: index → visibility map → heap Если страница таблицы all-visible, PostgreSQL может обойтись индексом. Если нет — приходится читать heap, чтобы проверить видимость строки. Поэтому Heap Fetches: 184320 — важный сигнал. Он показывает, что index-only scan был выбран, но обращений к heap осталось много. Вывод: смотреть нужно не только на название узла Index Only Scan, но и на фактические показатели выполнения: Heap Fetches, BUFFERS, частоту изменений таблицы и состояние visibility map. #УЦФОРС #PostgreSQL #DBA #Индексы #Оптимизация

