如果设置了PK之前添加的数据,Postgres PK索引不适用?

时间:2018-07-10 15:28:50

标签: postgresql performance indexing foreign-keys

我们正在使用Postgres 9.4;我们有一些开发人员创建了没有主键的表,并且在表中有数据并创建了PK之后就加入了。我们通过“解释分析”看到的是,当对这些表的查询中包含少量数据(在这种情况下为15行)时,不使用隐式索引。

特别是,如果您以这种方式创建表并向其中加载一些数据:

drop table if exists A;

CREATE TABLE A (
    id integer NOT NULL
);

INSERT into A values (21200), (21300), (21301), (21251), (21202), (21203), (21252), (21253), (21302), (21254), (21255), (21304), (21305), (21204), (21755);

ALTER TABLE ONLY A ADD CONSTRAINT A_pkey PRIMARY KEY (id);

在此之后进行解释分析:

EXPLAIN ANALYZE
select * from A where id=21200;

您会看到进行表扫描。

"Seq Scan on a  (cost=0.00..1.19 rows=1 width=4) (actual time=0.006..0.008 rows=1 loops=1)"
"  Filter: (id = 21200)"
"  Rows Removed by Filter: 14"
"Planning time: 0.327 ms"
"Execution time: 0.031 ms"

如果在添加任何数据之前先添加了主键,那么您将看到索引扫描。

所以我的问题是...为什么会有所不同?考虑到这是一个小表,表扫描可能实际上并没有花费我什么,但是...为什么通过稍微不同的过程构造的2个相同的表会产生不同的结果(索引扫描与表扫描)?

0 个答案:

没有答案