🛠️ Index Only Scan есть. А ускорения почти нет.

В фактическом плане PostgreSQL видим:

Index Only Scan ... Heap Fetches: 184320

Команда добавила покрывающий индекс и ожидала, что запрос будет читать данные только из индекса.

Но Heap Fetches показывает важную деталь: при выполнении PostgreSQL всё равно много раз обращался к heap для проверки видимости строк.

Почему так бывает? Index Only Scan означает, что нужные данные потенциально можно получить из индекса. Но PostgreSQL должен ещё проверить, видима ли строка текущему запросу с учётом MVCC.

Для этого используется visibility map:

index → visibility map → heap

Если страница таблицы помечена all-visible, строку можно вернуть без чтения heap. Если такой отметки нет, PostgreSQL идёт в heap и проверяет видимость строки там. Поэтому Index Only Scan в плане не гарантирует, что чтений heap не будет вообще.

Что смотреть: — Heap Fetches в EXPLAIN (ANALYZE, BUFFERS); — насколько часто меняется таблица; — помогает ли текущий режим VACUUM/autovacuum поддерживать visibility map; — действительно ли индекс покрывает все нужные колонки; — не слишком ли оптимистичны ожидания от covering index.

Практический вывод: покрывающий индекс может быть полезен, но не гарантирует нулевые heap fetches. Если Index Only Scan есть, а эффект слабый, смотрите не только на название узла, но и на фактические показатели выполнения.

🔹🔹🔹🔹

🛠️ Index Only Scan есть. А ускорения почти нет.
В фактическом плане PostgreSQL видим:
Index Only Scan .. | Сетка — социальная сеть от hh.ru