Postgres:如何对非常大的表进行分组并将结果插入到新表中?

时间:2017-02-17 23:16:12

标签: postgresql postgis

我正在使用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的机器上工作。那么我的一次性命令可能是最好的吗?

2 个答案:

答案 0 :(得分:1)

由于ST_Union是一个聚合函数,您可以在select

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

如上所述,这是一个大型数据集,我正在使用一台机器   16GB的RAM。所以可能是我的一次命令一次性的方法   毕竟是最棒的?

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

答案 1 :(得分:0)

您可以尝试使用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"

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