Есть ли способ оптимизировать запрос, сделанный так:
SELECT count(*) FROM mytable
WHERE
indexed_field IN ('v1', 'v2', ..., 'v2000')
AND NOT regular_field='something'
AND other_regular_field='something_else';
Этот запрос "работает".Проблема в том, что это очень медленно (1мин +).Я думал, что с помощью выражения IN
было бы хорошо использовать определенный список, но оказалось, что это не так хорошо.
Я использую Postgresql 9.6.
Моя таблица имеет310K.
Запрос expl:
QUERY PLAN
Aggregate (cost=396158.70..396158.71 rows=1 width=8) (actual time=8630.558..8630.559 rows=1 loops=1)
-> Seq Scan on mytable (cost=0.00..396156.77 rows=772 width=0) (actual time=7853.840..8630.478 rows=916 loops=1)
Filter: (((non_indexed_field)::text <> 'value1'::text) AND ((non_indexed_field)::text = 'value2'::text) AND ((indexed_field)::text = ANY ('{lots and lots of values....}'::text[])))
Rows Removed by Filter: 306768
Planning time: 2.543 ms
Execution time: 8630.770 ms
С анализом, буферы:
Aggregate (cost=396158.70..396158.71 rows=1 width=8) (actual time=9278.560..9278.560 rows=1 loops=1)
Buffers: shared hit=14244
-> Seq Scan on mytable (cost=0.00..396156.77 rows=772 width=0) (actual time=8584.520..9278.431 rows=916 loops=1)
Filter: (((non_indexed_field)::text <> 'value1'::text) AND ((non_indexed_field)::text = 'value2'::text) AND ((indexed_field)::text = ANY ('{lots and lots of values}'::text[])))
Rows Removed by Filter: 306768
Buffers: shared hit=14244
Planning time: 1.293 ms
Execution time: 9278.646 ms
(8 rows)