在事务中包装postgresql命令:truncate vs delete或upsert / merge

时间:2012-11-27 09:12:04

标签: postgresql plpgsql common-table-expression truncate plpython

我在postgresql 9.1.3中使用以下命令将数据从临时临时表移动到同一数据库中的webapp(geoserver)中使用的表。然后放下临时表。

  1. TRUNCATE table_foo;

  2. INSERT INTO table_foo

    SELECT * FROM table_temp;

  3. DROP TABLE table_temp;

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

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

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

1 个答案:

答案 0 :(得分:3)

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数量。