原子地替换PostgreSQL表中所有内容的“正确”方法?

时间:2018-05-05 11:40:04

标签: sql postgresql

在我最近工作的项目中,许多(PostgreSQL)数据库表仅用作大型查找数组。我们有几个后台工作服务,它们定期从服务器中提取最新数据,然后用最新数据替换表中的所有内容。替换必须是原子的,因为我们不希望查找器看到部分完成的表。

我认为最简单的替换方法是这样的:

BEGIN;
DELETE FROM some_table;
COPY some_table FROM 'source file';
COMMIT;

但我发现很多生产代码都使用这种方法:

BEGIN;
CREATE TABLE some_table_tmp (LIKE some_table);
COPY some_table_tmp FROM 'source file';
DROP TABLE some_table;
ALTER TABLE some_table_tmp RENAME TO some_table;
COMMIT;

(我省略了一些逻辑,例如更改序列的所有者等)

我看不出这种方法的任何优点。特别是经过一些发现和实验。像ALTER TABLEDROP TABLE这样的SQL语句会获得ACCESS EXCLUSIVE锁,甚至会阻止SELECT。

任何人都可以解释后一种SQL模式试图解决的问题吗?或者它是错的,我们应该避免使用它?

0 个答案:

没有答案