pg_stat_statements是PG中监控数据库活动的重要插件,通过它可以获得SQL的统计信息,例如该SQL被调用了多少次,返回了多少记录,在读写数据上花了多少时间,这个对于监控数据库很有帮助。默认情况下,这个插件可以统计5000个SQL,如果不够可以调整pg_stat_statements.max这个GUC。

一般情况下,可以通过源码安装该插件:

1, 先编译安装pgsql

2,在pg源码的目录下执行 make install -C contrib/pg_stat_statements

3,修改pg的配置文件postgres.conf,在其中加上一行

shared_preload_libraries = 'pg_stat_statements'

4,启动数据库,执行下面的SQL添加该插件:

CREATE EXTENSION pg_stat_statements

该语句会在系统中创建一个视图pg_stat_statements,这个视图中包含了很多有用的监控信息.

前面说到这个插件默认统计5000个SQL,那么如果新执行了一个SQL,该插件则会以SQL的查询计划为输入来计算hash码,(这个hash码就是pg_stat_statements视图中的queryid),然后去查找插件中已经统计的SQL的queryid,如果发现该hash码和某个已经存在的SQL的queryid相同,则将统计结果累加到这个SQL的统计结果中;没有发现,则会添加到插件中,或是满了5000条了就通过类似LRU的算法替换掉某个SQL(这点细节需要看代码)。

因此,这个插件在比对SQL时,智能程度还是很高的,只有语义上相同才会当作相同的SQL。例如下面三个SQL:

select * from t1 where a =1;
select * from t1 where a =2;
select * from t1 where a =3;

会被这个插件当作一个SQL(严格上说是一类)。

但是,有时候太智能也不太好:今天早上一个开发的同事来找我,说从pg_stat_statements中获得了很多重复的结果。登上他的测试环境,结果的确让人很奇怪:

很明显,结果中出现了三种重复的结果:一个是使用sql来执行pg_xlog_location_diff这个函数,一类是执行drop操作,最后一个就是执行insert 操作。

第一眼看上去很吃惊,但是查看了文档http://www.postgresql.org/docs/9.4/static/pgstatstatements.html,再结合下SQL的处理流程,可以回答为什么前会有前两种重复的结果:

对于执行select pg_xlog_location_diff() 这样的SQL,(抱歉,之前的解释不对,晚上回家看了代码,调试了一下,才发现之前的解释不对,pg还是会为这样只执行函数而不访问表的SQL生成查询计划的,只不过在优化的时候,已经获得了函数的结果),主要是因为执行SQL的用户不一样,所以插件认为是不同的SQL。并且,如果同一个用户连接不同的数据库去执行同一个SQL,插件也会认为是不同的SQL。

对于drop 操作的SQL重复出现,其实可以从文档里面就知道了,因为文档里面说的很明确了“Plannable queries (that is, SELECT, INSERT, UPDATE, and DELETE) are combined into a single pg_stat_statements entry whenever they have identical query structures according to an internal hash calculation.”

而对于insert 操作的SQL重复出现,刚开始怎么也无法解释,后来问了问开发的同学怎么操作数据库的,就恍然大悟了:因为他每次连数据库都会建立一个心跳表,这是个临时表,然后执行那一堆insert 操作来判断数据库是否活着。

一说临时表,就明白了七八分:因为他的临时表是session级别的,一个session连上来建立的临时表在断开session时,pg会自动删除临时表。虽然每次建立的临时表都是同一个表,一模一样,但是从数据库的角度来说,就是一个不同的表的了。所以每次session 第一次insert 这个表的SQL都会和前一次session执行的insert SQL是不同的,虽然他们字面上是一模一样的。当然,他们生成的查询计划的语义也是完全不一样的了。 而且考虑到pg_stat_statements的容量有限,最好还是建立一个非临时表。

本文来自云栖社区合作伙伴“DBGEEK”

使用pg_stat_statement监控pgsql遇到的问题相关推荐

  1. Zabbix实战-简易教程--DB类--Pgsql(pg_monz介绍)

    一.pg_monz介绍 1.介绍 pg_monz是一套用于专门监控pgsql的监控脚本,通过zabbix-sender将数据发送给server端.github上看软件介绍,是一个日本人写的. gith ...

  2. pgsql 运行状态 采集脚本

    脚本来自德哥的github地址,https://github.com/digoal/pgsql_admin_script/blob/master/generate_report.sh 内容如下: #! ...

  3. pgsql数据库默认配置事务类型_PostgreSQL基础教程之:初始化配置

    PostgreSQL基础教程之:初始化配置 时间:2020-04-27 来源: PostgreSQL基础教程之:初始化配置 一.配置pg_hba.conf 先说明客户端认证配置文件pg_hba.con ...

  4. zabbix监控-基本原理介绍

    一.Linux下开源监控系统简单介绍 1)cacti:存储数据能力强,报警性能差 2)nagios:报警性能差,存储数据仅有简单的一段可以判断是否在合理范围内的数据长度,储存在内存中.比如,连续采样数 ...

  5. PostgreSQL、Greenplum 日常监控 和 维护任务

    标签 PostgreSQL , Greenplum , Recommended Monitoring and Maintenance Tasks , 监控 , 维护 背景 Greenplum的日常监控 ...

  6. 【APP】centos 5.X安装网络和系统监控管理平台--OpenNMS

    关于OpenNMS:OpenNMS是一个企业级基于Java/XML的分布式网络和系统监控管理平台.OpenNMS是你管理网络的绝好工具,它能够显示你网络中各中终端和服务器的状态和配置,为你方便地管理网 ...

  7. zabbix的安装(一)监控os资源:内存,cpu,io,负载,带宽

    一.Linux下开源监控系统简单介绍 1)cacti:存储数据能力强,报警性能差 2)nagios:报警性能差,存储数据仅有简单的一段可以判断是否在合理范围内的数据长度,储存在内存中.比如,连续采样数 ...

  8. Oracle 数据怎么实时同步到 PgSQL | 亲测干货分享建议收藏

    摘要: 这段时间负责一个老项目开发的数据库管理工作,这个项目中开发库与测试数据库分离,其中有些系统表数据与基础资料数据经常需要进行同步,相信很多 DBA 同学经常会遇到要从一个数据库实时同步到另一个数 ...

  9. zabbix mysql pgsql_Zabbix 5.0 监控 PostgreSQL 数据库

    Zabbix 支持 PostgreSQL 作为后台数据库,相比 Mysql,PostgreSQL 可加载 timescaledb 插件,提升 Zabbix 性能,同时还支持数据的压缩,因此对于 Pos ...

最新文章

  1. JavaScript的基础
  2. js对浏览器内部及外部窗口宽度及高度使用测试
  3. command对象的获取 c#
  4. ROS学习笔记01:安装ROS - 玩小海龟
  5. html中ip输入格式正则表达式,通过正则表达式验证IP和端口格式的正确性
  6. Vue + Echarts 实现中国地图的绘制
  7. 【Python脚本进阶】2.4、conficker蠕虫(上):Metasploit攻击Windows SMB服务
  8. 楼宇跨界智能家居未来前景如何有待考证
  9. adrunio蜂鸣器音乐(天空之城)c调
  10. spring Boot手把手教学(8): 封装统一返回实体类
  11. 去除重复字母Python解法
  12. 艾司博讯:拼多多诱导非官方交易怎么处理?
  13. linux,常用命令符
  14. jpg格式图片打不开怎么办
  15. OkHttp之线程池的使用
  16. Arduino三位数码管
  17. Pushed master to new branch origin/master
  18. VSCode如何关掉右边的缩略图(预览面板)
  19. 身份证二要素验证的使用场景介绍
  20. 【POJ】1008 Maya Calendar

热门文章

  1. 造一个鸿蒙,仅有华为还不够
  2. 当AI实现多任务学习,它究竟能做什么?
  3. 5G产业发展最新进展深度解析(144页PPT)
  4. 预测|麦肯锡预测2030年:1亿中国人面临职业转换,全球8亿人被机器人取代
  5. 一张图看懂微软人工智能
  6. 打破国外垄断,我国拿下一项“制芯”关键技术
  7. 物联网将在2018年实现大规模发展:以下是IBM的4大预测
  8. 亮相2018CES:解读阿里云IoT筹谋全球物联网市场的一盘大棋!
  9. ​Google 鼓励的 13 条代码审查标准,建议收藏!
  10. 鸿蒙内核源码分析:调度机制篇