Я перемещаю базу данных Postgres на другой сервер.После импорта данных (с помощью pg_dump) я проверил производительность и обнаружил, что один и тот же запрос приводит к различным планам запросов для двух БД (учитывая, что версии СУБД, структура БД и сами данные одинаковы):
запрос:
explain analyse select * from common.composite where id = 0176200005519000087
план запроса производственной БД:
Index Scan using composite_id_idx on composite (cost=0.43..8.45 rows=1 width=222) (actual time=0.070..0.071 rows=1 loops=1)
Index Cond: (id = '176200005519000087'::bigint)
Planning time: 0.502 ms
Execution time: 0.102 ms
для нового:
Bitmap Heap Scan on composite (cost=581.08..54325.66 rows=53916 width=76) (actual time=0.209..0.210 rows=1 loops=1)
Recheck Cond: (id = '176200005519000087'::bigint)
Heap Blocks: exact=1
-> Bitmap Index Scan on composite_id_idx (cost=0.00..567.61 rows=53916 width=0) (actual time=0.187..0.187 rows=1 loops=1)
Index Cond: (id = '176200005519000087'::bigint)
Planning time: 0.428 ms
Execution time: 0.305 ms
Очевидно, что естьиндекс btree для идентификатора в обеих БД.Насколько я мог судить, новый использует почему-то битовую карту, в то время как btree был импортирован из дампа.Это приводит к огромной задержке (до 30 раз) в сложных запросах.
Что-то не так при импорте индекса / зависимостей или есть способ указать, какие индексы должен использовать планировщик?
Спасибо.