【问题标题】:Using ST_MakePoint for dataset with over 1 billion rows对超过 10 亿行的数据集使用 ST_MakePoint
【发布时间】:2020-11-25 23:31:16
【问题描述】:

我的 postgres 数据库(9.2.4 和 postgis 2.1.0SVN)中有一个大约 11 亿行的全局数据集。我的目标是使用多边形提取相关行。 查询从某一天开始跟踪并运行。

UPDATE table SET geom = ST_SetSRID(ST_MakePoint(long,lat),4326) where lat !=666 ;

666 是缺失值的占位符。 lat 列有 btree 索引。

free -m 给出了我的以下 ram 统计数据

total       used       free     shared    buffers     cached
Mem:         24104      23829        275          0          5      22738
-/+ buffers/cache:       1084      23020
Swap:        24574        309      24265

htop 显示我几乎没有 cpu 负载,内存为 9%。

查询是否因为缺少内存而不再运行或暂停?

感谢任何评论或提示。

【问题讨论】:

  • select * from pg_stat_activity 给你什么?你的 Postgres 版本是什么?
  • 原始帖子中的固定版本。您的查询告诉我等待是错误的并且状态是活动的。查询一天前开始,以及状态变化
  • 不幸的是,这可能需要大约一周的时间来处理!
  • 感谢麦克提供的信息。但我应该担心缺乏 cpu 负载还是对此有适当的解释?

标签: postgresql postgis


【解决方案1】:

最好使用 CURSOR 并将数据集分散到接近 1000 行的部分。

关于游标的文档在这里^https://www.postgresqltutorial.com/plpgsql-cursor/

【讨论】:

    【解决方案2】:

    如果可能,切勿将更新用作批量操作。为此,CTAS 以及删除和重命名表要好得多。 首先,创建表作为选择(CTAS)

    Create table "new_table" as
    select column_1, column_2.... column_n, ST_SetSRID(ST_MakePoint(long,lat),4326) geom
    where  lat !=666;
    

    如有必要,请检查您的结果。

    现在删除旧表并重命名新表。

    drop table "old_table";
    Alter table "new_table" rename "old_table".
    

    为重命名的表创建所有需要的索引、外键等。

    如果old_table上有外键等约束就行了

    alter table old_table disable trigger all;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      相关资源
      最近更新 更多