在 PostgreSQL 上 GIST 索引创建速度太慢

GIST index creation too slow on PostgreSQL

我在 PostgreSQL 中有一个具有以下结构的数据库:

Column    |         Type          | Collation | Nullable |                    Default                     
-------------+-----------------------+-----------+----------+------------------------------------------------
 vessel_hash | integer               |           | not null | nextval('samplecol_vessel_hash_seq'::regclass)
 status      | character varying(50) |           |          | 
 station     | character varying(50) |           |          | 
 speed       | character varying(10) |           |          | 
 longitude   | numeric(12,8)         |           |          | 
 latitude    | numeric(12,8)         |           |          | 
 course      | character varying(50) |           |          | 
 heading     | character varying(50) |           |          | 
 timestamp   | character varying(50) |           |          | 
 the_geom    | geometry              |           |          | 
Check constraints:
    "enforce_dims_the_geom" CHECK (st_ndims(the_geom) = 2)
    "enforce_geotype_geom" CHECK (geometrytype(the_geom) = 'POINT'::text OR the_geom IS NULL)
    "enforce_srid_the_geom" CHECK (st_srid(the_geom) = 4326)

数据库包含 ~146.000.000 条记录,包含数据的 table 的大小为:

public | samplecol   | table    | postgres | 31 GB      | 

我尝试使用以下命令在几何字段 the_geom 上创建 GIST 索引:

create index samplecol_the_geom_gist on samplecol using gist (the_geom);

但耗时太长。它已经运行了 2 个小时。

基于这个问题300GB Postgis 的缓慢索引table 问问题,在创建索引之前我在psql控制台执行:

ALTER SYSTEM SET maintenance_work_mem = '1GB'; 
ALTER SYSTEM


SELCT pg_reload_conf();

pg_reload_conf 
----------------  
t 
(1 row)

但是创建索引的时间太长了。有谁知道为什么?如何解决这个问题?

恐怕你得坐等了。

除了高 maintenance_work_mem 之外,没有真正的调整选项。 增加 max_wal_size 会有所帮助,因为您会得到更少的检查点。

如果您不能忍受 ACCESS EXCLUSIVE 锁那么久,请尝试 CREATE INDEX CONCURRENTLY,这会更慢,但不会阻塞并发数据库 activity。