博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PostgreSQL 快速给指定表每个字段创建索引 - 1
阅读量:6507 次
发布时间:2019-06-24

本文共 1983 字,大约阅读时间需要 6 分钟。

标签

PostgreSQL , 索引 , 所有字段 , 并行创建索引 , max_parallel_maintenance_workers


背景

如何快速给表的所有字段,每个字段都加上索引。

满足任意字段组合查询的需求。

例子 (PostgreSQL 11)

1、如果需要在单个事务中要创建的索引非常多(表多,字段数多),可能超过数据库中配置的锁的上限。取决于一下两个参数。

max_locks_per_transaction=512  max_connections=2000

2、为了使用并行创建索引,需要设置足够多的WORKERS。取决于如下参数

max_worker_processes=64

3、创建表空间,用于存储索引。(可选,如果有多个块设备时,建议创建独立的表空间,存放索引)

/dev/mapper/vgdata01-lv01  3.2T  505G  2.7T  16% /data01  /dev/mapper/vgdata01-lv02  3.2T  105G  3.1T   4% /data02    postgres=# create tablespace tbs1 location '/data02/pg/tbs1';  CREATE TABLESPACE

4、设置需要创建索引的表的并行度,创建索引时,可以用并行创建索引的功能。

do language plpgsql $$  declare    tables name[] := array['t1','t2','t3'];   -- t1,t2,t3表    n name;   begin    foreach n in array tables loop      execute format('alter table %s set (parallel_workers =24)', n);     end loop;  end;  $$;

5、并行创建索引,t1,t2,t3表,每个字段创建一个索引。使用并行度24.

do language plpgsql $$  declare    tables name[] := array['t1','t2','t3'];     n name;     x name;     i int;    sql text;    ts1 timestamp;    ts2 timestamp;  begin    set max_parallel_maintenance_workers=24;   -- 创建索引时的并行度        set max_parallel_workers=32;    set max_parallel_workers_per_gather=32;    set maintenance_work_mem='1GB';      set min_parallel_table_scan_size=0;    set min_parallel_index_scan_size=0;    set parallel_setup_cost=0;    set parallel_tuple_cost=0;      foreach n in array tables loop      i := 1;        for x in select attname from pg_attribute where attrelid=n::regclass and attnum>=1 and not attisdropped loop        sql := format('create index IF NOT EXISTS idx_%s__%s on %s (%s) tablespace tbs1', n, i, n, x);   -- 封装创建索引的SQL        ts1 := clock_timestamp();        raise notice '% start execute: %', ts1, sql;        execute sql;  -- 创建索引          commit;  -- pg 11已支持procedure, do里面开子事务      ts2 := clock_timestamp();        raise notice '% end execute: % , duration: %', ts2, sql, ts2-ts1;        i:=i+1;      end loop;      execute format('analyze %s', n);     end loop;  end;  $$;

参考

转载地址:http://sszfo.baihongyu.com/

你可能感兴趣的文章
visual studio如何附加到进程调试python命令
查看>>
volatile
查看>>
布局 约束添加规则
查看>>
程序寄存器与指令寄存器
查看>>
Vue slot分发内容
查看>>
十年阿里java架构师的六大设计原则和项目经验
查看>>
作为完美主义者(强迫症)如何将linux的eth1网卡修改为eth0网卡
查看>>
微信小程序之 Index(仿淘宝分类入口)
查看>>
java播放wav文件
查看>>
Linux - ubuntu 设置固定ip和设置dns
查看>>
SQLServer 进程无法向表进行大容量复制(错误号: 22018 20253)
查看>>
读懂 Deployment YAML - 每天5分钟玩转 Docker 容器技术(125)
查看>>
在SpringBoot中使用FluentValidator验证插件
查看>>
MySQL数据库锁定机制
查看>>
elasticsearch
查看>>
阿里盒马领域驱动设计实践
查看>>
vuex 存值 及 取值 的操作
查看>>
HDU 2242 考研路茫茫——空调教室(边双连通)
查看>>
如何在C#项目中使用NHibernate
查看>>
使用vigil 监控微服务系统包含可视化界面
查看>>