5

我在 postgresql 9.1.3 中使用以下命令将数据从临时登台表移动到 webapp(地理服务器)中使用的表,所有这些都在同一个数据库中。然后删除临时表。

  1. 截断表_富;

  2. 插入到 table_foo

    选择 * FROM table_temp;

  3. 删除表 table_temp;

我想将其包装在事务中以允许并发。数据集小于 2000 行,截断比删除快。

  • 在事务中运行这些命令的最佳方式是什么?
  • 是否建议在 CTE 中创建函数或编写 UPSERT/MERGE 等?
  • 删除所有行然后从临时表中批量插入而不是 TRUNCATE 会更好吗?
  • 在 postgres 中,哪个允许回滚 TRUNCATE 或 DELETE?
  • 临时表每天通过在 arcpy 中编写的 ETL 交付,如何在 postgres 中自动执行截断/删除/批量插入部分?
  • 我愿意使用 PL/pgsql、PL/python(或 postgres 推荐的 py)

目前,在将临时临时表导入我的数据库后,我正在手动执行 sql 命令。

4

1 回答 1

4

两者truncatedelete可以回滚(手册中有明确记录)。

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 数量降至最低。

于 2012-11-27T09:24:50.497 回答