2017-02-17 15 views
1

PostGISでPostgres 9.6で作業しています。私はポリゴンがその郡のポリゴンの集合であることと、郡ごとに1つのポリゴンを含む新しいテーブルを作成したいと思いますPostgres:非常に大きなテーブルをグループ化し、結果を新しいテーブルに挿入するには?

         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  | 

:私は(30ギガバイト程度)非常に大きなテーブルがあります。私は2番目のテーブルに最初のテーブルから一度に1つの郡を挿入する方法を知っている

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を搭載したマシンで作業しています。結局のところ、私のワン・コマンド・アット・タイム・アプローチが最善のものかもしれません。 ST_Union以来

答えて

1

は、PostgreSQLは、大規模なデータセットを扱うに非常に優れているので、あなたがあなたの選択

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

As noted this is a large dataset, and I'm working on a machine with 16GB of RAM. So it may be that my one-command-at-a-time approach is the best after all?

おそらく

ないでGROUP BYを行うことができます集約関数です。経験則として、1つの大きなクエリは小さなクエリの集合よりも高速になります。

+0

ありがとうございます - 残念ながら私は 'SSL SYSCALL error:EOF detected。サーバーに接続できませんでした。リセットを試みました:失敗しました。 - 大きなクエリのために推測しますか? – Richard

+0

これはリモートから行っていますか? SSHをdbマシンにインストールし、そこからクエリを実行します。 – e4c5

+0

私は、リモートマシンにSSHdを持っているスクリーンセッションでそれをやっています。画面セッションを閉じてデータベースを確認しましたが、レコードは追加されませんでした。 – Richard

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" 

あなたが指定する列が正しいことを確認する必要があります。

関連する問題