首页 > 解决方案 > 如果在设置 PK 之前添加数据,则不遵守 Postgres PK 索引?

问题描述

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

标签: postgresqlperformanceindexingforeign-keys

解决方案


推荐阅读