4

我在postgresql 9.1.3中使用以下命令將數據從臨時登臺表移動到webapp(geoserver)中使用的表中相同的分貝。然後放下臨時表。在事務中包裝postgresql命令:truncate vs delete或upsert/merge

  1. TRUNCATE table_foo;

  2. INSERT INTO table_foo

    SELECT * FROM table_temp;

  3. DROP TABLE table_temp;

我想在事務中包裝這個以允許併發。數據集小於2000行,截斷速度快於刪除速度。

  • 在事務中運行這些命令的最佳方式是什麼?
  • 正在CTE中創建一個建議的函數或寫一個UPSERT/MERGE等?
  • 刪除所有行,然後從臨時表中批量插入而不是TRUNCATE會更好嗎?
  • 在允許回滾TRUNCATE或DELETE的postgres中?
  • 臨時表每天通過一個ETL腳本在ETOP中傳遞,我如何在postgres中自動執行截斷/刪除/批量插入部分?
  • 我打開使用PL/pgSQL中,PL/Python的(或者Postgres的推薦PY)

目前,我手動執行SQL命令臨時臨時表導入到我的數據庫之後。

回答

3

Both,truncate and delete可以回滾(手冊中明確記錄)。

truncate - 由於其性質 - 在能見度方面有一些奇怪之處。

詳情請參見手冊:http://www.postgresql.org/docs/current/static/sql-truncate.html(在底部的警告)

如果您的應用程序可以與事實table_foo是「空」在這個過程活着,截斷可能是更好的(再次看到大紅色在說明手冊中進行說明)。如果你不希望應用程序通知,您需要使用delete

要運行在一個事務中這些語句簡單地把它們放進一個:

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

無論你做,在一個功能與否是由你決定。

truncate/insert將會更快(比delete/insert),因爲這樣可以最小化WAL生成量。

+0

感謝您的建議。這很好。由於是MVCC安全的,我將使用DELETE FROM和TRUNCATE。你有什麼建議或使用python來調用psql命令的經驗。我正在使用pyodbc並將事務置於python查詢字符串中。雖然我聽說過使用psycopg2。 – EnzovsJacques

+0

@EnzovsJacques:對不起,我不使用Python。 –