2017-06-06 7 views
2

私は定期的にCSVからソースデータを読み込み、Postgres(9.6)のテーブルを置き換えるETLに取り組んでいると言います。ここでPostgresのトランザクションにおけるDROP TABLEの動作

は一つの方法である:ここでは

BEGIN 
DROP TABLE IF EXISTS table 
CREATE TABLE table (...) 
COPY table FROM STDIN (FORMAT csv, HEADER true) 
CREATE INDEX ON table (...) 
COMMIT 

は別です:

BEGIN 
CREATE TABLE table_temp (...) 
COPY table_temp FROM STDIN (FORMAT csv, HEADER true) 
CREATE INDEX ON table_temp (...) 
DROP TABLE IF EXISTS table 
ALTER TABLE table_temp RENAME TO table 
COMMIT 

は、私は次のように関する正しいですか?

  • 最初のトランザクションはDROPコマンドでテーブルをロックするので、トランザクションが完了するまでの同時SELECTクエリがブロックされます。
  • COPYおよびCREATE INDEXが終了するまで、2回目のトランザクションではSELECTクエリがブロックされません。
  • 両方のトランザクションがアトミックです。いずれの場合も、COMMITの代わりにROLLBACKを発行すると、元のデータとインデックスをすべて使用してテーブルが復元されます。

また、インデックスの名前とは別の機能上の違いはありますか?

答えて

0

はい、あなたの前提の3つすべてが正しいです。

両方のトランザクションの場合でも最終結果は同じですが、最初のトランザクションによってブロックされる時間は長くなり、インデックスの作成に要するデータ量と時間によって異なります。 2番目のトランザクションでは、オブジェクトの名前を変更するために非常に短いロックが必要です。