The*_*o F 3 postgresql geometry postgis sql-update
我有一个包含 2900 万行的大型 PostgreSQL 表。大小(根据 pgAdmin 中的统计选项卡几乎为 9GB。)该表是在 gis 后启用的,具有空的几何列。
我想使用 ST_GeomFromText 更新几何列,从存储在同一个表中的 X 和 Y 坐标列(SRID:27700)读取。但是,立即在整个表上运行此查询会导致“磁盘空间不足”和“与服务器的连接丢失”错误......后者不太常见。
为了克服这个问题,我应该分批/分阶段更新 2900 万行吗?如何处理 100 万行(前 100 万行),然后处理接下来的 100 万行,直到达到 2900 万行?
或者还有其他更有效的方法来更新这样的大型表吗?
我应该补充一点,该表托管在 AWS 中。
我的更新查询是:
UPDATE schema.table
SET geom = ST_GeomFromText('POINT(' || eastingcolumn || ' ' || northingcolumn || ')',27700);
Run Code Online (Sandbox Code Playgroud)
您没有提供任何服务器规格,在最新的硬件上写入 9GB 可以相当快。
您应该可以接受一次较长的更新 -除非您对该表有并发写入。
克服此问题(非常长的事务,锁定对表的写入)的常见技巧是根据主键将 UPDATE 拆分为范围,并在单独的事务中运行。
/* Use PK or any attribute with a known distribution pattern */
UPDATE schema.table SET ... WHERE id BETWEEN 0 AND 1000000;
UPDATE schema.table SET ... WHERE id BETWEEN 1000001 AND 2000000;
Run Code Online (Sandbox Code Playgroud)
对于高水平的并发写入,人们使用更微妙的技巧(例如:SELECT FOR UPDATE / NOWAIT、轻量级锁、重试逻辑等)。