PostgreSQL 15中带主键的COUNT关联查询为何慢于SELECT INTO后查询?
PostgreSQL 11升级至15(PostGIS 2.5→3.3)后主键导致空间关联COUNT查询异常问题
问题背景
将PostgreSQL从11版本升级至15版本(同步升级PostGIS从2.5到3.3)后,出现如下异常:
- 拥有约1400万行数据的
table_1,执行带空间关联的COUNT查询时始终无法完成; - 将
table_1数据导入无主键的table_2后,执行相同的COUNT查询可在约15分钟内完成。
异常与正常操作对比
无法完成的查询语句
-- 此语句始终无法结束 select count(*) FROM table_1 t1 INNER JOIN table_1 t2 ON (ST_Equals(t1.wkb_geometry, t2.wkb_geometry)) WHERE t1.gid > t2.gid ;
可正常完成的操作
-- 先将数据导入无主键表table_2 select * into table_2 from table_1 ; -- 相同查询可正常执行,约15分钟完成 select count(*) FROM table_2 t1 INNER JOIN table_2 t2 ON (ST_Equals(t1.wkb_geometry, t2.wkb_geometry)) WHERE t1.gid > t2.gid ;
索引与排查动作
索引配置
两张表均已为wkb_geometry字段创建GIST索引:
CREATE INDEX table_1_geom ON table_1 USING gist (wkb_geometry) TABLESPACE pgdata;
已尝试的排查操作
- 重建
table_1的GIST索引 - 对
table_1执行VACUUM操作
以上操作均未解决问题。
关键发现
移除table_1的gid主键约束后,原查询可正常执行;而table_2本身无gid主键,因此查询正常。
核心疑问
PostgreSQL 15中主键的处理逻辑发生了哪些变化,导致了这一差异?
table_1的创建DDL
SELECT ST_MakeLine(sp,ep) AS wkb_geometry, ogc_fid, ... INTO table_1 FROM (SELECT ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) as sp, ST_PointN(geom, generate_series(2, ST_NPoints(geom) )) as ep, ogc_fid, ... FROM (SELECT (ST_Dump(ST_Boundary(wkb_geometry))).geom, ogc_fid, ... FROM another_table ) AS linestrings ) AS segments; ALTER TABLE table_1 ADD COLUMN gid serial NOT NULL; --ALTER TABLE table_1 ADD CONSTRAINT table_1_pk PRIMARY KEY (gid); CREATE INDEX table_1_geom ON table_1 USING gist (wkb_geometry) TABLESPACE pgdata;
内容的提问来源于stack exchange,提问作者no11
相关产品推荐
相关产品推荐

