postgresql - 如果在设置 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 个相同的表会产生不同的结果(索引扫描与表扫描)?
解决方案
推荐阅读
- python - 使 cx_Freeze main.py 永久能够使用 numpy 模块
- ios - 如何在 Swift 中邀请 Facebook 好友加入我的 iOS 应用程序?
- oracle - Flatten a hierarchy query PLSQL not using subqueries and functions
- mysql - 多边形中的点:向函数 st_within 提供的 GIS 数据无效
- python - 使用 Python 清除文本和删除停用词后,将数据从 Json 导入 Excel
- ios - 使用来自iOS中步骤点折线的谷歌方向api在GMS折线中平滑动画
- react-admin - 关闭 react-admin 的翻译
- javascript - 如何检查按钮是否被禁用?
- java - 春季授权未启动
- python - 如何静态链接python解释器?