2017-12-18 17 views
2

私は、エッジ(ジオメトリ)を含む10億行のテーブルを持っています。そのうちのいくつかは重複しており、次のクエリを使用して重複したエッジを削除しています。PostgreSQLのパーティションテーブル

DELETE FROM water_edges 
    WHERE id IN (
    SELECT e1.id 
    FROM water_edges e1, water_edges e2 
    WHERE st_equals(e1.geom_line, e2.geom_line) 
    AND e1.id < e2.id 
    ); 

しかし、私が使用する8つのコアを持っていると私は、クエリを変更したり、関数を作成するにはどうすればよい私は、同時に実行されているサブセットに削除機能を実行すると言って、それをフルに活用したいです。

答えて

0

あなたはそれを(まだ)行うことはできません。

これらのクエリのいくつかを並行して実行できます。 8を並列に実行する場合は、最初に、次にAND e1.id % 8 = 1を追加します。

クエリ速度は直線的に拡大されません。運が良ければ、クエリは同じシーケンシャルスキャンを共有できますが、I/Oシステムがボトルネックになっている可能性があります。

0

これらのケースで私が通常行ってきたことは、キースペースを連続したブロックに分割し、クエリを接続プールの接続に振り分けるスクリプトを作成することです。

これは、キー空間内で互いに接近しているタプルが同じページにある可能性が高いため(コアが重い作業負荷の場合)、コア間のバッファの待機と転送を最小限に抑えることができるため、 。

libpq(したがってほとんどのクライアント側ドライバ)は非同期クエリをサポートしているため、プール内のすべての接続に対してクエリを実行し、接続が定期的にポーリングされ、利用可能です。

関連する問題