Index Scan и Seq Scan возвращают разное количество ожидаемых строчек

Index Scan using ni_child_parent_uuid on child c (cost=0.43..1286.53 rows=636 width=16)(actual time=0.037..0.479 rows=206 loops=1)
Index Cond: (parent_uuid = '752726e3-af63-49a8-93e7-cfda65be27af'::uuid)
Parallel Seq Scan on child c (cost=0.00..831237.98 rows=91 width=16)(actual time=8232.835..11644.969 rows=206 loops=1)
Filter: (parent_uuid = '752726e3-af63-49a8-93e7-cfda65be27af'::uuid)

Почему отличается количество ожидаемых записей? Условие одно, бд одна, все одинаковое, просто в одном используется seq scan, а в другом используется index scan с помощью pg_hint_plan IndexScan(c).

Из-за разницы в 6 раз, в сложном запросе с джоинами оптимизатор предпочитает использовать seq scan, тк уменьшение в 6 раз очень сильно влияет на cost join.


Ответы (1 шт):

Автор решения: Даурен Байманов

Потому, что это количество строчек для одного запланированного процесса.

В данном случае запланировано 7 воркеров, 636/7=91.

P.S.: Проблема с запросом была связана, с недостаточной статистикой, увеличил - помогло:

alter table child alter column parent_uuid set statistics 10000
→ Ссылка