PostgreSQL索引扫描

时间:2018-03-06 07:59:28

标签: postgresql

我的表格包含以下索引:

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。

目前,我认为最好的方法是从表中删除旧数据。

0 个答案:

没有答案
相关问题