2017-06-06 39 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查詢將阻塞,直到交易完成。
  • 第二筆交易將不會阻止SELECT查詢,直到COPYCREATE INDEX完成。
  • 交易都是原子:在任何情況下,如果我發出了一個ROLLBACK,而不是COMMIT,該表將與所有的原始數據和索引恢復。

此外,除了索引的名稱之外,是否還有其他功能差異?

回答

0

是的,你所有的假設都是正確的。

最終的結果將是在情況下,兩個記錄,而是由第一事務引起會更長,並且取決於數據量和需要創建索引時的阻擋相同的。第二個事務需要一個非常簡短的鎖來重命名對象。