You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:41:31