Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 重复创建临时表导致pg_属性膨胀_Postgresql_Postgresql 9.6 - Fatal编程技术网

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;