在我最近工作的项目中,许多(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 TABLE
和DROP TABLE
这样的SQL语句会获得ACCESS EXCLUSIVE锁,甚至会阻止SELECT。
任何人都可以解释后一种SQL模式试图解决的问题吗?或者它是错的,我们应该避免使用它?