🛠️ 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 есть, а эффект слабый, смотрите не только на название узла, но и на фактические показатели выполнения.
🔹🔹🔹🔹