【问题标题】:Postgres: How to group a very large table and insert the results into a new table?Postgres:如何对一个非常大的表进行分组并将结果插入到一个新表中?
【发布时间】:2017-02-17 23:16:12
【问题描述】:

我正在使用 PostGIS 使用 Postgres 9.6。我有一个非常大的表(大约 30GB):

                                       Table "public.parcels"
    Column    |          Type           |                            Modifiers
--------------+-------------------------+------------------------------------------------------------------
 ogc_fid      | integer                 | not null default nextval('parcels_ogc_fid_seq'::regclass)
 wkb_geometry | geometry(Polygon,4326)  |
 county       | character varying       |

我想创建一个新表,其中每个县包含一个多边形,该多边形是该县多边形的并集。我已将我的新表定义如下:

 gid      | integer                 | not null default nextval('newtable_gid_seq'::regclass)
 the_geom | geometry(Polygon,4326) |

我知道如何一次将一个县从第一个表插入到第二个表中:

INSERT INTO by_county(the_geom) values 
  ((SELECT ST_Union(wkb_geometry) FROM parcels where county='Warwick'));

但是我怎样才能以编程方式为所有县执行此操作?我目前的方法是使用 psycopg2 编写一个 Python 脚本,该脚本首先检索DISTINCT 县名,然后为每个县手动运行上述命令:但我想知道是否有更少手动的方法。

如前所述,这是一个大型数据集,我正在使用具有 16GB RAM 的机器。所以我的一次一个命令的方法可能是最好的吗?

【问题讨论】:

    标签: postgresql postgis


    【解决方案1】:

    由于 ST_Union 是一个聚合函数,您可以在选择中执行 GROUP BY

    INSERT INTO by_county(county, the_geom)
       SELECT country, ST_Union(wkb_geometry) FROM parcels GROUP BY county
    

    如前所述,这是一个大型数据集,我正在使用 16GB 内存。所以我的一次一个命令的方法可能是 毕竟是最好的?

    可能不是因为 postgresql 非常擅长处理大型数据集。根据经验,一个大查询比一组小查询要快。

    【讨论】:

    • 谢谢 - 不幸的是,当我尝试得到SSL SYSCALL error: EOF detected The connection to the server was lost. Attempting reset: Failed. - 我猜是因为查询量很大?
    • 您是从远程执行此操作吗? SSH 进入数据库机器并从那里执行查询。
    • 我在屏幕会话中执行此操作,将 SSHd 连接到远程计算机。我关闭了屏幕会话并检查了数据库,没有添加任何记录。
    • 事件序列:(i) ssh 进入远程服务器 (ii) 启动屏幕会话 (iii) 运行命令,等待,查看上面评论中的错误 (iv) 打开另一个 ssh 会话并终止死屏会话(v) 在新的 ssh 会话中,检查数据库,没有添加记录。正如你所说,我认为本地连接已经死了,这就是为什么我只能通过另一个 ssh 会话终止屏幕会话。
    • 这个整理好了吗?
    【解决方案2】:

    您可以尝试使用COPY 命令。你可以试一试

    psql -d <DATABASE> -c "copy (SELECT country, ST_Union(wkb_geometry) FROM parcels GROUP BY county) to STDOUT" | psql -d <DATABASE> -c "copy by_county from STDIN"
    

    您必须确保您指定的列是有序的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-25
      • 2018-04-04
      • 2014-04-29
      • 2021-10-11
      • 2015-07-18
      • 2020-02-15
      • 2014-01-15
      • 1970-01-01
      相关资源
      最近更新 更多