Postgres事务中的DROP TABLE行为

时间:2017-06-06 16:45:07

标签: sql database postgresql transactions

说我正在开发ETL,它定期从CSV中读取源数据并替换Postgres(9.6)中的表。

这是一种方法:

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查询将一直阻塞,直到事务完成。
  • SELECTCOPY完成之后,第二项交易不会阻止CREATE INDEX次查询。
  • 这两个事务都是原子的:在任何一种情况下,如果我发出ROLLBACK而不是COMMIT,则表将使用所有原始数据和索引进行恢复。

另外,除了索引的名称外,还有其他功能差异吗?

1 个答案:

答案 0 :(得分:4)

是的,你的所有3个假设都是正确的。

在两个事务的情况下,最终结果都是相同的,但第一个事务导致的阻塞会更长,并且取决于数据量和创建索引所需的时间。第二个事务需要一个非常简短的锁来重命名对象。