当前位置: 首页 > news >正文

PostgreSQL 快速给指定表每个字段创建索引 - 1

标签

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


背景

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

《PostgreSQL 设计优化case - 大宽表任意字段组合查询索引如何选择(btree, gin, rum) - (含单个索引列数超过32列的方法)》

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

例子 (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、设置需要创建索引的表的并行度,创建索引时,可以用并行创建索引的功能。

《PostgreSQL 11 preview - 并行排序、并行索引 (性能线性暴增) 单实例100亿TOP-K仅40秒》

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;  
$$;  

参考

《PostgreSQL 设计优化case - 大宽表任意字段组合查询索引如何选择(btree, gin, rum) - (含单个索引列数超过32列的方法)》

《PostgreSQL 11 preview - 并行排序、并行索引 (性能线性暴增) 单实例100亿TOP-K仅40秒》

《PostgreSQL dblink异步调用实践,跑并行多任务 - 例如开N个并行后台任务创建索引, 开N个后台任务跑若干SQL》

相关文章:

  • 玻璃手机后壳或将成为主流,荣耀专注三年极光玻璃 获赞有眼光!
  • 《数据结构与算法》-3-栈和队列
  • 马哥教育第四十一至四十三学习总结
  • 如何备份MySQL数据库
  • 开拓者软件开发团队
  • zabbix3.2监控linux磁盘IO
  • python 笔记 之 random 随机模块
  • 2019哪些是更靠谱的创业赛事活动平台?
  • javascript变量作用域
  • eclipse no java machine vitual was found
  • centos7.5
  • boost_tutorial
  • 快速搭建个人博客
  • 一文读懂ML中的解析解与数值解
  • java B2B2C Springcloud电子商务平台源码 -Feign之源码解析
  • [PHP内核探索]PHP中的哈希表
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • E-HPC支持多队列管理和自动伸缩
  • exif信息对照
  • Javascript弹出层-初探
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • MySQL QA
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Rancher如何对接Ceph-RBD块存储
  • 力扣(LeetCode)965
  • 使用parted解决大于2T的磁盘分区
  • 网页视频流m3u8/ts视频下载
  • ​Python 3 新特性:类型注解
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #include<初见C语言之指针(5)>
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (超详细)语音信号处理之特征提取
  • (待修改)PyG安装步骤
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (七)理解angular中的module和injector,即依赖注入
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • **PHP二维数组遍历时同时赋值
  • .net core控制台应用程序初识
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .Net中的设计模式——Factory Method模式
  • @JsonSerialize注解的使用
  • @SentinelResource详解
  • [20181219]script使用小技巧.txt
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [Android View] 可绘制形状 (Shape Xml)
  • [Android]常见的数据传递方式
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • [bzoj 3124][sdoi 2013 省选] 直径
  • [C#]获取指定文件夹下的所有文件名(递归)
  • [Kubernetes]8. K8s使用Helm部署mysql集群(主从数据库集群)
  • [LeetCode]Balanced Binary Tree