Я выполняю запрос подсчета для таблицы postgresql. Название таблицы - симкарты, содержащие поля id, card_state и еще 10. Simcards содержит около 13 миллионов записей
Мой запрос
SELECT CAST(count(*) AS INT) FROM simcards WHERE card_state = 'ACTIVATED';
Это занимает более 6 секунд, и я хочу оптимизировать его. Я попытался создать частичный индекс ниже
CREATE INDEX activated_count on simcards (card_state) where card_state = 'ACTIVATED';
Но без улучшений. Я думаю, это потому, что я получил более 12 миллионов записей с card_state = 'ACTIVATED'. Обратите внимание, что card_state может быть 'ACTIVATED', 'PREPROVISIONED', 'TERMINATED'
Кто-нибудь получил представление о том, как можно существенно улучшить счет?
Запуск EXPLAIN (ANALYZE, BUFFERS) SELECT CAST(count(*) AS INT) FROM simcards WHERE card_state = 'ACTIVATED';
дает
Finalize Aggregate (cost=540300.95..540300.96 rows=1 width=4) (actual time=7103.814..7103.814 rows=1 loops=1)
Buffers: shared hit=2295 read=155298
-> Gather (cost=540300.74..540300.95 rows=2 width=8) (actual time=7103.773..7103.810 rows=3 loops=1)
Workers Planned: 2
Workers Launched: 2
Buffers: shared hit=2295 read=155298
-> Partial Aggregate (cost=539300.74..539300.75 rows=1 width=8) (actual time=7006.368..7006.368 rows=1 loops=3)
Buffers: shared hit=5983 read=455025
-> Parallel Seq Scan on simcards (cost=0.00..526282.77 rows=5207186 width=0) (actual time=2.677..6483.503 rows=4166620 loops=3)
Filter: (card_state = 'ACTIVATED'::text)
Rows Removed by Filter: 10965
Buffers: shared hit=5983 read=455025
Planning time: 0.333 ms
Execution time: 7123.739 ms