PostgreSQL pg_qualstats 解决索引缺失,添加索引
商业数据库中,很多新版本都可以自动创建索引,给出索引创建的建议,并且以此作为卖点,ORACLE ,SQL SERVER 均有类似的功能,实际上通过查询语句,与全表扫描的语句,与谓词的比对,做出这样的系统其实不不是一件很难的事情。
我们下面采用PG11 的版本来进行相关的工作,(安装中遇到很多问题,最终还算解决了)
1 需要安装 PGDG的repo 环境,这样能节省你很多的安装中的麻烦以及依赖包问题。具体请移步PGDG中查看对应你版本的安装信息,并且安装 pg-devel环境
2 可以通过下载rpm包的方式安装
https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pg_qualstats11-1.0.9-1.rhel7.x86_64.rpm
也可以下载源码包,进行编译安装,这里就省略了安装的过程。
最终的效果应该在配置文件中,添加pg_stat_statements 和 pg_qualstats 以及创建 extension pg_qualstats pg_stat_statements 这2个插件。
首先我们要知道 pg_qualstats 到底能做什么,pg_qualstats是一个PostgreSQL扩展,用于保存“WHERE”语句和“JOIN”子句中谓词的统计信息。
看上图可以看到相关 pg_qualstats 的变量
另外需要将pg_qualstats.track_constants 关掉,否则会收集很多类似的查询占用相关的存储位置。
我们可以写一个存储过程,批量运行一些查询语句,在执行完毕后,我们可以通过 pg_qualstats_indexes来查看当前查询中的谓词,并且这些谓词是没有索引的,以及查询的次数。
同时根据 pg_qualstats_indexes_ddl 表可以看到 pg_qualstats 推荐你需要建立的索引,(因为PG支持的索引多,所以提供了一种索引需求的多种建立方案)
故事到这里看似完了,其实不然。我们先的说说这个插件是从何而来,去往何处,在哪里打间,在哪里住店.....
实际上是有一个程序的组建,powa ,通过这个组建本身是可以动态,WEB化查询系统中缺失的索引,并给出相关信息的。这里我们仅仅是借用了这个软件的一部分,也可以说叫 client。我们使用的这个插件仅仅是负责收集信息使用的。但其实对我们来说,已经足够了,如果你有几十台的PG 到是可以进一步的安装这个软件,来讲所有的PG 囊获其中。软件的名字叫 PostgreSQL Workload Analyzer。
使用了这个插件后能回答你对系统的几个问题
平时系统是怎么进行查询的,经常查询的语句是什么,查询中同一个查询不同的值的分布式怎样的,那些列会经常在一起查询。
实际上我们可以问自己几个问题,我为什么要用这个软件,会使用这个插件,并且通过他来建立一些索引,自然是好的,但这也透露出一个问题,开发在开发系统的时候,并不知道自己的SQL 语句,或无法提供,并且DBA 也在系统上线前对此一无所知,这其实就是一个BUG,而通过这个工具来弥补,那只能是虎狼の药。另外的就是不要迷信这个软件,认为头痛医头,脚痛医脚,其实病根在心。(以上啰嗦几句,不感兴趣的客官可以移步 NEXT STATION)
我们回来看看这个插件里面的一些表
1 pg_qualstats 这个表本身包含了执行语句的用户,表所处的数据库是那个,以及表名(可以通过和其他表连接后获得相关信息),另外关键的execution_count 和 nbfiltered 这里面的意思是这个语句执行了多少次,并且多少次是重复的,另外也包含的queryid, 可以追溯你的查询语句。
2
select * from pg_qualstats_by_query ;
这个表重要的地方在于queryid 通过这个表才能关联你要的查询语句,最后通过关联其他表将其显示出来
3
select * from pg_qualstats_indexes 这个表也是关键,他给出了你查询中需要建立索引的建议
另外还有一些其他的表,这里就不在介绍了,直接给一些自己写的列子来阐述一下这个工具到底可以解决实际什么问题
1 如何确认语句运行的时间,下面这个SQL 可以定期的运行,来获取系统中运行的SQL 以及每条SQL的平均运行时间。
with table_info as (select pc.relname,pgq.execution_count,pgq.uniquequalnodeid
from pg_qualstats as pgq
left join pg_class as pc on pgq.lrelid = pc.relfilenode),
query_info as (
select pss.total_time/calls as average_time,pss.query,pgb.uniquequalnodeid
from pg_qualstats_by_query as pgb
left join pg_stat_statements as pss on pgb.queryid = pss.queryid)
select *
from table_info as t
right join query_info as q on t.uniquequalnodeid = q.uniquequalnodeid
2
select pqi.relid,pqi.attnames,pqi.execution_count,pqd.idxtype,pqd.ddl
from pg_qualstats_indexes_ddl as pqd
left join pg_qualstats_indexes as pqi on pqd.relid = pqi.relid and pqd.attnames = pqi.attnames
上面这个SQL 可以查看到底那个表上需要建立什么样的索引,配合上面的表可以通过查询语句来确认添加索引的正确性。
最后说说他的想法是什么
第一步是获取查询中所有的谓词,并分析这个查询中提取的谓词是否有益于查询,这个信息存储在pg_qualstats中,在这其中会去重一些同样的语句,但会记录相关的次数,当然这其中也和查询的方式有关,如果你是多个条件加and的操作,则这些条件会进行记录。根据查询的次数,和频繁度,查询数据的分布,等推荐需要建立的索引的方式。最终生成相关的DDL 语句。
如果你要问,这个有什么缺陷,当然有,你猜
PostgreSQL pg_qualstats 解决索引缺失,添加索引相关推荐
- Navicat mysql 加索引_mysql 索引 (Navicat添加索引)
索引类型:NORMAL 索引方法:BTREE 一般这样子设置就OK了 一.sql查询语句 SELECT bp.id AS post_id, `bp`.`title`, bp.img AS bbs_ ...
- mysql索引与md5_MySQL理解索引、添加索引的原则
索引用于快速找出在某个列中有一特定值的行.不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行,还需要考虑每次读入数据页的IO开销.而如果采取索引,则可以根据索引指向的页以及记录在 ...
- mysql创建索引要加index吗_MySql创建索引,添加索引
alter table 数据库add index 索引名称(数据库字段名称) PRIMARY KEY(主键索引) ALTER TABLE `table_name` ADD PRIMARY KEY ( ...
- 【Mysql数据库】数据库添加索引方式
文章目录 数据库添加索引方式 1.添加PRIMARY KEY(主键索引) 2.添加UNIQUE(唯一索引) 3.添加普通索引 4.添加全文索引 5.添加多列索引 数据库添加索引方式 1.添加PRIMA ...
- 解决endnotes给word文件添加索引失败问题
解决endnotes给word文件添加索引失败问题 之前按正常的操作,通过endnotes向word文档添加索引,文档下方无法出现索引列表.弄了半天都没改好,可能是因为软件是wps而不是office? ...
- [Ubuntu18.04遇到的问题及解决办法]缺失字体如何手动添加字体
@[TOC][Ubuntu18.04遇到的问题及解决办法] 缺失字体如何手动添加字体 大家在使用Ubuntu时,可能会遇到系统缺失字体的问题,比如,安装WPS会提示缺失simsun,wingdings ...
- python tableview绑定字典_TableView索引的添加
首先是在这个代理函数中添加索引数组: #pragma mark-索引显示数组 - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)ta ...
- mysql给数据量大的表添加索引的办法
有一个问题,一张表有3百万条记录,随着时间的增加,记录量会更多,此时查询速度很慢.在创建此表前没有未相应字段添加索引,所以此时需要为表添加索引.但是因为数据量大的原因,索引添加不成功,想了很多办法,终 ...
- dax powerbi 生成表函数_Power BI应用技巧:如何为DAX建的表添加索引?
来源于知识星球中一个星友的问题,使用DAX在PowerBI中新建了一个表,如何为这个表添加索引列呢? 假如数据模型中只有一张订单表,需要从订单表中提取客户表,可以直接使用VALUES函数提取一个不 ...
最新文章
- BIOS和Bootloader的区别
- Solr 查询时候关键期 编码问题
- (转)Objective-C Autorelease Pools(自动释放池)详解
- 联捷俞海乐:从技术leader到CEO视野和责任提升几个维度
- [ASP.NET Core] Middleware
- CSS display属性的值及作用
- c语言课程设计修改订单流程图,C语言课程设计————写下流程图! 谢谢
- htcvr设备计算机配置,HTC Vive电脑配置要求多高?享受VR虚拟现实还要一台好电脑!...
- 推荐两个不错的公众号
- Android 开机底层优化
- java将时间戳转换成字符串_java 时间戳与日期字符串相互转换详解
- 小米手机连接电脑只能看到部分相片_小米手机连接电脑后怎么看照片?
- 无老师作文巨讲堂2015.8
- java 特立独行的幸福
- 简易的安卓天气app(四)——搜索城市、完善页面
- 就dsaf就打开了撒酒疯
- 声明$(function(){})的含义
- 解决移动端,wap站,m站适配方案整理
- 统计素数并求和(20分)
- 学生党技术博客公众号第1月总结:收入|学习|定位规划|是否该接广告?
热门文章
- 2款免费工具,让Windows秒“变”macOS!
- 董明珠直播从翻车到3小时卖3亿是其半生写照:极度渴望成功,愿付非凡代价
- 蚂蚁金服人工智能部技术总监李小龙:智能金融实践
- pandas数据分析给力教程【完整版】(六)
- opencv交叉编译 和 The C/C++ compiler is not able to compile a simple test program.
- 《考试脑科学》读书笔记【图文详解】
- jsp/java旅行社旅游信息管理系统
- 国内八大众筹平台-2015版
- 罗氏帝国一代功臣黄柏兴为何激流勇退后重出江湖加盟迪安!
- HTML自适应情侣纪念日记录单页源码