我有两个列完全相同的表。第一个是用于生产,web应用程序(Django)从其中检索对象以显示在网页上。我使用Python脚本将对象添加到第二个对象中。当脚本完成时,我需要用table-2中的行替换table-1中的所有行。现在我使用的是这样的东西:
TRUNCATE table-1;
INSERT INTO table-1 (columns) SELECT columns FROM table-2;
TRUNCATE table-2;
VACUUM FULL;问题是它花费了太长的时间,并且在截断表之后-1网站在插入完成之前是无用的。实现这一目标的最佳方式是什么?
发布于 2016-02-04 06:17:45
您可以尝试创建一个视图并针对此编写django代码。当需要在table1和table2之间切换时,只需使用create or replace view切换到另一个表。
发布于 2016-02-04 06:12:23
你根本不需要昂贵的VACUUM FULL。在你的大INSERT之后,就没有什么需要清理的了。没有死元组,并且所有索引都处于原始状态。
不过,运行ANALYZE来立即更新完全更改的表统计信息是有意义的。
对于小型表,DELETE可能比TRUNCATE更快,但对于中型到大型表,TRUNCATE通常更快。
并在单个事务中完成所有这些操作。在同一事务中的TRUNCATE之后的INSERT不必写入WAL,并且速度要快得多:
BEGIN;
TRUNCATE table1;
INSERT INTO table1 TABLE table2;
TRUNCATE table2; -- do you need this?
ANALYZE table1; -- might be useful
COMMIT;详细信息:
如果您在table1上有任何索引,最好先删除它们,然后在大表的INSERT之后重新创建它们。
如果你没有依赖对象,你也可以删除table1并重命名table2,这会快得多。
这两种方法都需要表上的独占锁。但是你一直在使用VACUUM FULL previously which takes an exclusive lock as well:
VACUUM FULL在没有额外空间的情况下将表的全部内容重写到一个新的磁盘文件中,从而允许将未使用的空间返回给操作系统。此表单的速度要慢得多,并且在处理每个表时都需要一个排它锁。
因此,可以放心地假定独占锁对您来说是合适的。
https://stackoverflow.com/questions/35188684
复制相似问题