Как заставит Postgres выбирать первичный индекс а не фильтр?

confguru

ExAdmin
Команда форума
Как заставит Postgres выбирать первичный индекс а не фильтр?

Как заставит Postgres выбирать первичный индекс а не фильтр? Т/е во втором варианте очень медленно выбираются данный

p.s. это часть большого запроса


1)explain select min(thm_start_date) from themes where themes.cmp_id=11;
QUERY PLAN
--------------------------------------------------------------------------------------
Aggregate (cost=3284.01..3284.01 rows=1 width=4)
-> Index Scan using contains_fk on themes (cost=0.00..3281.15 rows=1145 width=4)
Index Cond: (cmp_id = 11)
(3 rows)

2)explain select min(thm_start_date) from themes where themes.cmp_id=12;
QUERY PLAN
---------------------------------------------------------------------
Aggregate (cost=21056.12..21056.12 rows=1 width=4)
-> Seq Scan on themes (cost=0.00..20682.09 rows=149615 width=4)
Filter: (cmp_id = 12)
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
1) Что говорит EXPLAIN ANALYZE?
2) Вместо
Код:
select min(thm_start_date) from themes where themes.cmp_id=11;
часто имеет смысл
Код:
select thm_start_date from themes where themes.cmp_id=11 order by thm_start_date limit 1;
который будет использовать индекс по thm_start_date, если таковой присутствует.
 

confguru

ExAdmin
Команда форума
explain analyze select min(thm_start_date) from themes where themes.cmp_id=11;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=3284.01..3284.01 rows=1 width=4) (actual time=25.77..25.78 rows=1 loops=1)
-> Index Scan using contains_fk on themes (cost=0.00..3281.15 rows=1145 width=4) (actual time=25.75..25.76 rows=1 loops=1)
Index Cond: (cmp_id = 11)
Total runtime: 40.19 msec
(4 rows)


explain analyze select min(thm_start_date) from themes where themes.cmp_id=12;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------
Aggregate (cost=21056.12..21056.12 rows=1 width=4) (actual time=2165.52..2165.52 rows=1 loops=1)
-> Seq Scan on themes (cost=0.00..20682.09 rows=149615 width=4) (actual time=511.72..2027.42 rows=179887 loops=1)
Filter: (cmp_id = 12)
Total runtime: 2165.63 msec
(4 rows)

думаю создать view для всех тем с max и min датами и уже его использовать - будет лучше?
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
[ VACUUM ] ANALYZE themes давно делался? А то оптимизатор считает, что в таблице на 30000 меньше записей, чем реально есть.

думаю создать view для всех тем с max и min датами и уже его использовать - будет лучше?
вряд ли, ведь во view тот же самый запрос будет.
 

confguru

ExAdmin
Команда форума
Каждую ночь делается - причем фулл
Пока пришли к выводу что нужно триггер написать - который обновлял бы значения - в таблицах где это нужно

А view - попробую - так как этот селект как бы в цикле запрашивается для всех cmp_id
 
Сверху