当前位置: 首页 > 知识库问答 >
问题:

后灰岩:更新大型表

楚洋
2023-03-14

我有一个包含2900万行的大型PostgreSQL表。该表的大小(根据pgAdmin中的stats选项卡,几乎为9GB)为post-gis启用了一个空的geometry列。

我想使用ST_GeomFromText更新几何体列,从存储在同一表中的X和Y坐标列(SRID:27700)读取数据。但是,一次对整个表运行此查询会导致“磁盘空间不足”和“服务器连接丢失”错误……后者的频率较低。

为了克服这个问题,我应该分批次/阶段更新2900万行吗?如何100万行(第一100万),然后执行下100万行,直到达到2900万?

或者是否有其他更有效的html" target="_blank">方法来更新像这样的大型表?

我应该补充一点,该表托管在AWS中。

我的UPDATE查询是:

UPDATE schema.table
SET geom = ST_GeomFromText('POINT(' || eastingcolumn || ' ' || northingcolumn || ')',27700);

共有2个答案

范朗
2023-03-14

从我最初的问题:

但是,一次在整个表上运行此查询会导致“磁盘空间不足”和“与服务器的连接丢失”错误……后者不太频繁。

结果是我们的Amazon AWS实例数据库空间不足,导致我最初的ST_GeomFromText查询无法完成。释放空间修复了它。

值得注意的是,正如@mlinth所建议的那样,ST_Point运行我的查询比ST_GeomFromText快得多(24分钟vs 2小时)。

我的最后一个问题是:

UPDATE schema.tablename
SET geom = ST_SetSRID(ST_Point(eastingcolumn,northingcolumn),27700);
王才英
2023-03-14

你没有给出任何服务器规格,在最新的硬件上写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;

对于高级别的并发写入,人们使用更微妙的技巧(如:SELECT For UPDATE/NOWAIT、轻量级锁、重试逻辑等)。

 类似资料:
  • 问题内容: 我正在尝试编写一些搜索输入,以使用ngResource从数据库中获取数据。 数据在页面上显示为ng-repeat,但是当我执行搜索并且$ scope已更新时,该视图未更新并显示旧数据。 这是代码: main.html(活动视图) main.js searchbar.js 当它启动时,它从数据库中获取所有数据并正确显示它们,当我尝试进行搜索时,$ scope.eventi会更新(我可以从

  • 问题内容: 我正在尝试使用包含Latex样式方程式的AngularJS双向绑定文本。我想调用MathJax格式化方程式,但是我不确定在AngularJS完成更改模型后确保调用MathJax的最佳方法。我想我需要回调。这是我的JavaScript: } 这是我的HTML: 小提琴在这里:http : //jsfiddle.net/LukasHalim/UVjTD/1/。您会注意到,即使您单击两次更新

  • 我的视图中有一个树查看器,它从标准的Ecore编辑器中监听EMF模型,并用它做进一步的事情。我已经注册了一个选择监听器,它检查所选元素是否是树查看器需要作为输入的类型。因此,问题是,如果模型中有任何变化(例如,向现有元素添加新元素或新信息等),树查看器仅在用户更改选择时才显示更改后的模型,即单击任何模型元素等。 但是我需要做的是,如果底层模型发生变化,树查看器将直接得到通知,并显示新的模型元素,而

  • 我有一个表,其中有一个主id列(自动索引)、两个子id列(也已索引)和12列类型geometry(Polygon)。如果我要更新此表上的约200万行,运行约200万条单独的更新语句是否更快 还是像下面的答案那样,执行较少数量的较大更新语句更快 如果是后者,你对什么是好的有什么建议吗?是 = ~2mil,还是一些较小的子集(我会重复直到它们全部完成)? 编辑:显然,在前一种情况下,我会使用准备好的语

  • 问题内容: 我正在尝试使用bootstrapscollspy突出显示由角度中继器生成的列表项。 我遇到的问题是,我在Angle将模型更改应用到视图之前,正在从angular控制器刷新scrollspy插件。 确保DOM本身已更新(不仅仅是角度模型)之后,确保scrollspy(’refresh’)调用发生的角度方法是什么? 模板: 控制器: 问题答案: 我如何使用Blesh的答案解决此问题 模板:

  • 问题内容: 我有一个3,076,568个二进制值(1s和0s)的NumPy数组。我想将其转换为矩阵,然后在Python中转换为灰度图像。 但是,当我尝试将数组重塑为1,538,284 x 1,538,284矩阵时,出现内存错误。 如何减小矩阵的大小,以便将其变成适合屏幕显示的图像而又不丢失唯一性/数据? 此外,如何将其转换为灰度图像? 任何帮助或建议,将不胜感激。谢谢。 问题答案: 您的“二进制值