优化postgresDB上的sql查询

时间:2018-05-18 18:31:40

标签: sql postgresql

我的数据库中有大约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';

执行时间会少吗?

1 个答案:

答案 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,以便整个数据库适合内存。

  • 快速存储。

但我认为您的设计很奇怪,最好的解决方案是找到避免这些定期更新的方法。