我的数据库中的一个表必须每天更新。 Web服务器每5秒主动查询该表。现在我不能简单地UPDATE
表行因为一些约束,所以我需要清除所有行并重新填充表。如何在不影响Web服务器功能的情况下安全地执行此操作?
重新填充由与Web服务器隔离的其他Web服务完成。我正在使用Spring框架。
表格大约有。 170k行和5列。
答案 0 :(得分:2)
在单个事务中截断并重新填充表。 对于并发读者来说,截断是不可见的,他们会继续查看旧数据。 @AlexanderEmelianov和the docs的更正:
TRUNCATE不是MVCC安全的。截断后,如果表使用在截断发生之前拍摄的快照,则表对于并发事务将显示为空。有关详细信息,请参阅Section 13.5。
所以在TRUNCATE
txn提交之后,并发txns在之前启动 TRUNCATE
会将表视为空。
任何在截断表后写的事务将等到执行截断的事务提交或回滚。
BEGIN;
TRUNCATE TABLE my_table;
INSERT INTO my_table (blah) VALUES (blah), (blah), (blah);
COMMIT;
您也可以COPY
代替INSERT
。正常交易中的任何事情。
更好的是,PostgreSQL中的优化使得在截断之后填充表格比在其他情况下更快地填充表格。