在批量数据变更后,由于autovacuum触发机制原因,或autovacuum任务繁忙原因,统计信息收集可能会一定的延时,此时统计信息是不准确的,会导致相关SQL的执行计划生成不准确,从而导致SQL执行变慢甚至执行卡死问题。
批量数据变更包括:批量导入数据、批量更新数据、批量删除数据、truncate表、truncate表+批量导入数据。
针对此问题,应在批量数据变更后,手动执行vacuum analyze收集统计信息。
在执行vacuum analyze前,可以适当调大maintenance_work_mem来提高效率,例如:
set maintenance_work_mem to '8GB';
vacuum analyze 表名;
可能会因为账号权限要求,应用账号没有对该表的vacuum analyze权限,可创建函数解决此问题:
create or replace function user_analyze (schema_name text,table_name text) returns int as
$$
declare
v_sql text;
begin
v_sql := 'vacuum analyze ' || schema_name || '.' || table_name;
execute v_sql;
return 1;
end;
$$
language plpgsql;
select user_analyze('public','teledb_1');