Я использую PostgreSQL 9.3. Может ли кто-нибудь помочь мне, что я могу сделать, чтобы это улучшить. Максимальное количество записей в таблице db составляет от 5000 до 7000, меняется ежедневно. Параметр shared_buffers в базе данных PGsql равен 1 ГБ. что здесь не так. Мой запрос o / p
ПЛАН ЗАПРОСА
Nested Loop (cost=0.85..10873.44 rows=75 width=271) (actual time=0.123..51.515 rows=3982 loops=1)
Buffers: shared hit=18475 read=55682
Index Scan using idx_chrghist_picked_status on charge_history (cost=0.42..10239.13 rows=75 width=255) (actual time=0.092..16.022 rows=3982 loops=1)
Index Cond: (picked_status = 'NOTPICKED'::text)
Filter: ((updated_date)::date = (('now'::cstring)::date - 1))
Rows Removed by Filter: 10022
Buffers: shared hit=2547 read=55682
Index Scan using "CUSTOMERID" on subscriber_data (cost=0.43..8.45 rows=1 width=36) (actual time=0.008..0.008 rows=1 loops=3982)
Index Cond: ((customer_id)::text = (charge_history.customer_id)::text)
Buffers: shared hit=15928
Total runtime: 52.053 ms
Запрос:
EXPLAIN (BUFFERS,ANALYZE)
SELECT
subscriber_data.customer_id ,
charge_history.charge_trx_id,
charge_history.updated_date,
charge_history.command_tx_id ,
charge_history.mvno_id,
charge_history.customer_id,
charge_history.extra_plan_id,
charge_history.base_plan_id,
charge_history.old_base_plan_id,
charge_history.volume,
charge_history.price,
charge_history.charge_type,
charge_history.remarks
FROM charge_history , subscriber_data
WHERE subscriber_data.customer_id=charge_history.customer_id
AND charge_history.updated_date::date=(CURRENT_DATE - integer '1')
AND 'charge_history.picked_status = 'NOTPICKED';
Этот запрос выполняется за 52 мс, вероятно, немного. Это два сканирования индекса и вложенный цикл, который возвращает 3982 строки.
Возможно, вы не могли бы использовать text
, или установить NOTPICKED
к null
(если этот столбец еще не использует null).