我们正在使用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个相同的表会产生不同的结果(索引扫描与表扫描)?