我的数据库中有大约700个表。当我运行下面的脚本时,需要将近1个小时。我该如何优化此查询?
数据库:Postgres
DO $$
DECLARE
tables_list CURSOR FOR
select distinct t_name, t_schema from information_schema.columns
where column_name = 'deleted_flag'
and t_schema='customer' and t_name not like 'v_%';
BEGIN
FOR t_record IN tables_list LOOP
EXECUTE 'update ' || t_record.table_schema || '.' || t_record.table_name || ' set deleted_flag=false';
END LOOP;
end;
$$;
最后,此架构中的所有表都应将此字段deleted_flag设为false。我必须经常在生产环境中运行此脚本。感谢有人可以帮助您优化此脚本。
您认为是否在where子句中添加检查,
EXECUTE 'update ' || t_record.table_schema || '.' || t_record.table_name || ' set deleted_flag=false where deleted_flag=true';
执行时间会少吗?
答案 0 :(得分:1)
没有办法让它真正有效。
以下是您可以采取哪些措施加快速度:
您绝对应该在查询中添加WHERE deleted_flag
以避免不必要的更新。
如果只有少数行deleted_flag = true
,您可以像这样创建部分索引:
CREATE INDEX ON atable ((1)) WHERE deleted_flag;
如果有太多行要使部分索引有用,请使用fillfactor = 50
创建表,并确保deleted_flag
上没有索引。
然后你可以享受更便宜的HOT更新。
将max_wal_size
设置得足够高,以免检查点过多。
获取足够的RAM,以便整个数据库适合内存。
快速存储。
但我认为您的设计很奇怪,最好的解决方案是找到避免这些定期更新的方法。