Postgresql 重复创建临时表导致pg_属性膨胀
我有一个过程,每天创建数千个临时表,将数据导入系统 它采用以下形式:Postgresql 重复创建临时表导致pg_属性膨胀,postgresql,postgresql-9.6,Postgresql,Postgresql 9.6,我有一个过程,每天创建数千个临时表,将数据导入系统 它采用以下形式: create temp table if not exists test_table_temp as select * from test_table where 1=0; 这会很快在pg_属性中创建大量死行,因为它会不断生成许多新列,并在不久之后删除这些表中的列。我在其他地方看到过建议在提交-删除行时使用的解决方案。然而,这似乎也没有达到预期的效果 要测试上述内容,可以在测试数据库上创建两个单独的会话。在其中一个选项中,选
create temp table if not exists test_table_temp as
select * from test_table where 1=0;
这会很快在pg_属性中创建大量死行,因为它会不断生成许多新列,并在不久之后删除这些表中的列。我在其他地方看到过建议在提交-删除行时使用的解决方案。然而,这似乎也没有达到预期的效果
要测试上述内容,可以在测试数据库上创建两个单独的会话。在其中一个选项中,选中:
select count(*)
from pg_catalog.pg_attribute;
并记下n_dead_tup的值:
select n_dead_tup
from pg_stat_sys_tables
where relname = 'pg_attribute';
在另一个表上,创建一个临时表(需要从另一个表中进行选择):
对pg_属性的计数查询立即上升,甚至在我们到达提交之前。关闭临时表创建会话后,pg_属性
值将下降,但n_dead_tup
将上升,这表明仍然需要清空
我想我真正的问题是我是否错过了上面提到的东西,或者是处理这个问题的唯一方法是积极地抽真空,并承受随之而来的性能损失
感谢您提前回复。不,您已经正确理解了情况
您要么需要使autovacuum更具攻击性,要么需要使用更少的临时表
不幸的是,您无法更改目录表上的存储参数—至少不能以支持的方式进行升级—因此您必须对整个群集执行此操作。我正在挠头查看您对a的回答,试图找出为什么这样做会有帮助,因为我不认为这样做会有帮助,但我认为,在他的案例中,你是在暗示他实际上是在减少临时表的使用量。我想我得重写整件事,让它以不同的方式工作。谢谢你的回复!如果您使用的是9.6,并且没有更改autovacuum配置,那么您将使用autovacuum\u vacuum\u cost\u delay='20ms'
,这相当高。也许将其降低到2ms就足以使您的系统正常工作。
create temp table if not exists test_table_temp on commit delete rows as
select * from test_table where 1=0;