为什么';在本例中,PostgreSQL是否合并了两个索引?

为什么';在本例中,PostgreSQL是否合并了两个索引?,postgresql,Postgresql,我正在从“订单簿事件”创建订单簿的快照。下面的例子说明了任务的本质: CREATE TABLE t AS SELECT i.event_id, 10000*(round(i.event_id/10000,0)+1) AS last_event_id FROM ( SELECT * FROM generate_series(1,1000000) AS event_id ) i; ALTER TABLE t ADD PRIMARY KEY (event_id); CREATE INDEX t_

我正在从“订单簿事件”创建订单簿的快照。下面的例子说明了任务的本质:

CREATE TABLE t AS SELECT i.event_id, 10000*(round(i.event_id/10000,0)+1) AS last_event_id  FROM ( SELECT * FROM generate_series(1,1000000) AS event_id ) i;

ALTER TABLE t ADD PRIMARY KEY (event_id);

CREATE INDEX t_idx ON t USING btree  (last_event_id ASC NULLS LAST);

EXPLAIN ANALYZE SELECT * FROM T WHERE event_id <= 80001 and last_event_id >= 80001;
因此,PostgreSQL只使用t_pkey索引,而忽略t_idx

为什么PostgreSQL不同时使用t_pkey和t_idx


我在Centos 7上使用PostgreSQL 9.6,它是planner计算-两个都使用索引,它必须进行位图索引扫描,在这种情况下可能会有更大的成本。通过设置
set enable_indexscan=false
自己尝试一下,然后重新运行查询。@JustMe谢谢!注意:更改表定义或添加索引后,应始终在表上运行
VACUUM ANALYZE
<代码>(成本=0.42..2928.77行=73870宽度=9)(实际时间=52.526..52.529行=2个循环=1)@wildplasser只有功能索引才能从
分析中获益。不过,您更改表的操作是正确的。@LaurenzAlbe:在运行真空分析(但仍然是同一计划)后,我得到了不同的估计。在将上次事件id更改为'1*(一轮(I.event\u id/1000,0)+1)作为上次事件id'后,PG选择了不同的计划,但仅在分析之后。
                                                QUERY PLAN                                                     
-----------------------------------------------------------------------------
Index Scan using t_pkey on t  (cost=0.42..2928.77 rows=73870 width=9) (actual time=52.526..52.529 rows=2 loops=1)
  Index Cond: (event_id <= 80001)
  Filter: (last_event_id >= '80001'::numeric)
  Rows Removed by Filter: 79999
Planning time: 0.211 ms
Execution time: 52.578 ms