当前位置: 首页 > 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》

相关文章:

  • 前后端分离,tomcat特殊字符不识别问题
  • 纯前端的分页(利用vant的List组件)
  • 汉诺塔问题(Hanoi Tower)递归算法解析(Python实现)
  • 数据库(MySQL)
  • Hive分桶
  • 第三章:内存分配与回收策略
  • visual studio 命令行 build
  • 摘要商城总结
  • StringBuufer与StringBulder线程的区别
  • 微信分享到朋友圈,怎么自定义分享的标题,图片,内容?
  • BZOJ2300[HAOI2011]防线修建——非旋转treap+凸包(平衡树动态维护凸包)
  • 今日学习20190425
  • MAYA 卸载工具,完美彻底卸载清除干净maya各种残留注册表和文件
  • 跨域的理解,以及解决方案!
  • Android进阶:七、Retrofit2.0原理解析之最简流程
  • Android组件 - 收藏集 - 掘金
  • Angular数据绑定机制
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • Js基础知识(一) - 变量
  • Linux gpio口使用方法
  • passportjs 源码分析
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 大主子表关联的性能优化方法
  • 深入浏览器事件循环的本质
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 一份游戏开发学习路线
  • HanLP分词命名实体提取详解
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • $.ajax中的eval及dataType
  • %check_box% in rails :coditions={:has_many , :through}
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (ZT)薛涌:谈贫说富
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)Linux——Linux常用指令
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (已解决)什么是vue导航守卫
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • /run/containerd/containerd.sock connect: connection refused
  • /var/log/cvslog 太大
  • @vue/cli 3.x+引入jQuery
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [20160902]rm -rf的惨案.txt
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [ffmpeg] aac 音频编码
  • [FFmpeg学习]从视频中获取图片
  • [iOS开发]iOS中TabBar中间按钮凸起的实现
  • [JS]数据类型