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
を発行すると、元のデータとインデックスをすべて使用してテーブルが復元されます。
また、インデックスの名前とは別の機能上の違いはありますか?