我的数据库中的一张表必须每天更新。Web 服务器每 5 秒主动查询此表。现在,UPDATE由于某些限制,我不能简单地处理表格行,因此我需要清除所有行并重新填充表格。如何在不影响 Web 服务器功能的情况下安全地执行此操作?重新填充由与 Web 服务器隔离的其他 Web 服务完成。我正在使用 Spring 框架。
桌子上有大约。170k 行和 5 列。
在单个事务中截断并重新填充表。截断对并发读者不可见,他们继续查看旧数据。根据@AlexanderEmelianov 和文档进行更正:
TRUNCATE 不是 MVCC 安全的。截断后,如果并发事务使用截断发生之前拍摄的快照,则该表将显示为空。有关更多详细信息,请参阅第 13.5 节。
所以在之后TRUNCATE荷兰国际集团TXN提交,并发txns开始前的TRUNCATE会看到表为空。
任何在被截断后尝试写入表的事务都将等到执行截断的事务提交或回滚。
BEGIN;
TRUNCATE TABLE my_table;
INSERT INTO my_table (blah) VALUES (blah), (blah), (blah);
COMMIT;
Run Code Online (Sandbox Code Playgroud)
你也可以COPY代替INSERT。正常交易中的任何事情。
更好的是,PostgreSQL 中有一项优化,它可以在截断后填充表比在其他情况下更快。
| 归档时间: |
|
| 查看次数: |
3815 次 |
| 最近记录: |