我的表格包含以下索引:
celltick_db=> \d+ MTSMSes
Table "hangman.mtsmses"
Column | Type | Modifiers | Storage | Stats target | Description
----------+-----------------------------+-----------------------------------------------------------+----------+--------------+-------------
eventid | integer | not null default nextval('mtsmses_eventid_seq'::regclass) | plain | |
methodid | character varying(63) | not null | extended | |
moid | integer | not null | plain | |
phone | character varying(15) | not null | extended | |
text | character varying(511) | not null | extended | |
ts | timestamp without time zone | default now() | plain | |
索引: " mtsmses_pkey" PRIMARY KEY,btree(methodid,eventid)
在运行以下SQL时,它使用索引扫描运行:
celltick_db=> explain SELECT methodId,
moId, phone, text, eventId
FROM MTSMSes
where methodId='INTERACTIVE_REQUEST' and eventid>18606263;
QUERY PLAN
-------------------------------------------------------------------------------------------
Index Scan using mtsmses_pkey on mtsmses (cost=0.56..3350.24 rows=1856 width=172)
Index Cond: (((methodid)::text = 'INTERACTIVE_REQUEST'::text) AND (eventid > 18606263))
但是当运行如下时,它会生成seq。扫描:
celltick_db=> explain SELECT methodId, moId,
phone, text, eventId FROM MTSMSes where methodId='INTERACTIVE_REQUEST'
and eventid>(SELECT lastFetchedEventId FROM MTSMSesConsumers WHERE
methodId='INTERACTIVE_REQUEST');
QUERY PLAN
---------------------------------------------------------------------------------------------------------------
Seq Scan on mtsmses (cost=21.07..769488.62 rows=6188057 width=172)
Filter: ((eventid > $0) AND ((methodid)::text = 'INTERACTIVE_REQUEST'::text))
InitPlan 1 (returns $0)
-> Index Scan using mtsmsesconsumers_methodid_key on mtsmsesconsumers (cost=0.26..21.07 rows=1 width=4)
Index Cond: ((methodid)::text = 'INTERACTIVE_REQUEST'::text)
我建议使用" where子句"。如果有任何我应该更改的参数,请你建议吗(我试着设置enable_bitmapscan = on,但没有帮助)。
你有解释:
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------
Seq Scan on mtsmses (cost=21.07..769488.62 rows=6188057 width=172) (actual time=562634.438..1357306.944 rows=2 loops=1)
Filter: ((eventid > $0) AND ((methodid)::text = 'INTERACTIVE_REQUEST'::text))
Rows Removed by Filter: 18606173
Buffers: shared hit=328975 read=162034
InitPlan 1 (returns $0)
-> Index Scan using mtsmsesconsumers_methodid_key on mtsmsesconsumers (cost=0.26..21.07 rows=1 width=4) (actual time=0.231..0.275 rows=1 loops=1)
Index Cond: ((methodid)::text = 'INTERACTIVE_REQUEST'::text)
Buffers: shared hit=4
Total runtime: 1357309.108 ms
在mtsmses,我只有一个方法:
celltick_db=> select count(distinct methodid) from mtsmses;
count
-------
1
我的postgres正在运行 - random_page_cost = 4。
目前,我认为最好的方法是从表中删除旧数据。