5

postgresql 9.1.3 で以下のコマンドを使用して、データを一時ステージング テーブルからすべて同じデータベース内の webapp (ジオサーバー) で使用されているテーブルに移動しています。次に、一時テーブルを削除します。

  1. TRUNCATE table_foo;

  2. INSERT INTO table_foo

    SELECT * FROM table_temp;

  3. DROP TABLE table_temp;

同時実行を可能にするために、これをトランザクションにラップしたいと思います。データセットは 2000 行未満で、切り捨ては削除よりも高速です。

  • これらのコマンドをトランザクションで実行する最良の方法は何ですか?
  • 関数を作成することはお勧めですか、それとも UPSERT/MERGE などを CTE に記述しますか?
  • TRUNCATE ではなく、すべての行を削除してから、一時テーブルから一括挿入する方がよいでしょうか?
  • ロールバックTRUNCATEまたはDELETEを許可するpostgresでは?
  • 一時テーブルは、arcpy でスクリプト化された ETL を介して毎日配信されます。postgres 内の切り捨て/削除/一括挿入部分を自動化するにはどうすればよいですか?
  • PL/pgsql、PL/python (または postgres に推奨される py) を使用することにオープンです

現在、一時ステージング テーブルが DB にインポートされた後、SQL コマンドを手動で実行しています。

4

1 に答える 1

4

両方ともtruncateロールdeleteバックできます (これはマニュアルに明確に記載されています)。

truncate- その性質上、可視性に関していくつかの奇妙な点があります。

詳細については、マニュアルを参照してください: http://www.postgresql.org/docs/current/static/sql-truncate.html (下部の警告)

アプリケーションがtable_fooそのプロセス中に「空」であるという事実に耐えることができる場合は、おそらく truncate の方が適切です (説明については、マニュアルの大きな赤いボックスを再度参照してください)。アプリケーションに気付かれたくない場合は、使用する必要がありますdelete

これらのステートメントをトランザクションで実行するには、単純にそれらを 1 つにまとめます。

begin transaction;
delete from table_foo;
insert into ....
drop table_temp;
commit;

関数でそれを行うかどうかはあなた次第です。

truncate/は、生成される WAL の量を最小限に抑えるため( /insertよりも) 高速になります。deleteinsert

于 2012-11-27T09:24:50.497 に答える