`

使用pg_stat_statement监控pgsql遇到的问题

 
阅读更多

       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,这个视图中包含了很多有用的监控信息.简单的说来,这个插件会在PG数据库初始化的时候从共享内存中申请一块区域,这块区域主要是用作一个hash表,这个hash表将用来存储SQL的统计信息,默认是5000个不同的SQL。

     前面说到这个插件默认统计5000个SQL,那么如果新执行了一个SQL,该插件则会以SQL的查询计划为输入来计算hash码,(这个hash码就是pg_stat_statements视图中的queryid),然后去插件的哈希表中查找,如果发现该hash码和某个已经存在的SQL的queryid相同,则将统计结果累加到这个SQL的统计结果中;没有发现,则会添加到插件的hash表中,或是满了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中获得了很多重复的结果。登上他的测试环境,结果的确让人很奇怪:



 

      很明显,结果中出现了三种重复的结果:一种是执行pg_xlog_location_diff函数的SQL;一种是执行drop操作;最后一种就是执行insert 操作。

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

    1,对于执行select pg_xlog_location_diff() 这样的SQL,主要是因为执行SQL的用户不一样,所以插件认为是不同的SQL。并且,如果同一个用户连接不同的数据库去执行同一个SQL,插件也会认为是不同的SQL。从查询计划的角度来看,用户不同或是连接的数据库不同,即使其他内容相同,在数据库看来,也是不同的查询计划了。

    2,对于drop 操作的SQL重复出现,其实可以从文档里面就知道了,因为文档里面说的很明确了“Plannable queries (that is, SELECTINSERTUPDATE, and DELETE) are combined into a single pg_stat_statements entry whenever they have identical query structures according to an internal hash calculation.” 换言之,drop操作是没有查询计划的,因此没法判断一个drop操作之间是否相同,所以干脆当作都不同的

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

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

       

  • 大小: 42.2 KB
分享到:
评论

相关推荐

    pg_stat_statements.so(centos 7.3 x64)

    复制到 pgsql-12/lib 目录下就...shared_preload_libraries = 'timescaledb, pg_stat_statements' # (change requires restart) pg_stat_statements.max = 10000 pg_stat_statements.track = all 最后重启postgrelSQL

    pg_stat_monitor:PostgreSQL统计信息收集器

    PostgreSQL自带了一些内置的统计视图,如`pg_stat_activity`、`pg_stat_user_tables`等,这些视图提供了关于查询执行、等待事件、索引使用等基础信息。然而,这些信息可能不足以满足高级监控和诊断的需求,尤其是在...

    GP pg_catalog查询.docx

    13. **pg_stat_last_operation** 和 **pg_stat_last_shoperation**: 这两个表提供关于最近操作的元数据跟踪信息,分别针对特定对象和全局对象。`SELECT * FROM pg_catalog.pg_stat_last_operation;`和`SELECT * FROM...

    pg_stat_kcache:收集有关后端完成的物理磁盘访问和CPU消耗的统计信息

    其中,`pg_stat_kcache`扩展正是为了解决这一问题而诞生的。它提供了一种有效的方式来收集后端进程的物理磁盘访问和CPU消耗的详细统计信息,从而帮助管理员更好地理解和优化数据库性能。 `pg_stat_kcache`是基于...

    pg_stat_plans

    pg_stat_plans:pg_stat_statements变体,用于区分查询计划。 版本:1.0 作者:Peter Geoghegan 基于Peter Geoghegan和Simon Riggs的想法。介绍pg_stat_plans是标准Postgres contrib模块pg_stat_statements的变体。 ...

    pgactivity:每隔一段时间打印出pg_stat_activity的工具

    它以pg_stat_activity间隔(默认为每秒)查询pg_stat_activity视图。 用法很简单: $ pgactivity通过设置libpq环境变量对其进行配置。 所有可能的值,。 通常,您需要设置PGHOST , PGUSER和PGPASSWORD : $ PGHOST...

    PostgreSQL awr

    2. **收集性能数据**:可以使用`pg_stat_activity`视图获取当前活动查询的信息,`pg_stat_database`和`pg_stat_user_tables`获取数据库级别的统计,`pg_stat_bgwriter`了解后台写入器的行为。还可以通过`EXPLAIN`...

    10gRAC系列之三-使用crs_stat工具查看资源状态[借鉴].pdf

    通过 `crs_stat` 工具,RAC 管理员可以实时监控 RAC 系统的健康状况,及时发现并解决问题,确保数据库服务的稳定性和高效性。例如,当发现某个资源状态异常时,可以使用 `-p` 参数查看其详细属性,找出问题原因,...

    crs_stat -t报错1

    但是,在使用 CRS_STAT 命令时,可能会遇到各种错误,例如“crs_stat -t 报错1”。在本文中,我们将对 CRS_STAT 命令的错误进行分析,并提供解决方案。 错误原因分析 CRS_STAT 命令的错误可能是由于多种原因引起的...

    postgresql_exporter:一个用于某些postgresql指标的Prometheus导出器

    设置受限的监控用户默认情况下,某些统计视图(例如pg_stat_statements和pg_stat_activity)不允许查看其他用户运行的查询,除非您是数据库超级用户。 由于您可能不希望监视以超级用户身份运行,因此可以这样设置一...

    AA_stat-2.5.5-py3-none-any.whl.zip

    "使用说明.txt"很可能包含了安装和使用AA_stat库的具体指导,包括可能的依赖、系统要求、安装步骤以及如何在代码中调用库的函数等。而"AA_stat-2.5.5-py3-none-any.whl"则是实际的Wheel包文件,可以使用pip进行安装...

    pg_hint_plan-REL10_1_3_6.tar.gz

    同时,结合 PostgreSQL 的其他监控工具,如 `pg_stat_statements`,可以进一步分析查询的执行情况。 总结来说,`pg_hint_plan` 是一个强大的 PostgreSQL 插件,通过提供对执行计划的精细化控制,它能够帮助用户在...

    AA_stat-2.5.3-py3-none-any.whl.zip

    标题 "AA_stat-2.5.3-py3-none-any.whl.zip" 暗示了这是一个Python软件包,具体来说是一个名为AA_stat的库,版本号为2.5.3,它被封装在一个名为“whl”的归档格式中。这种格式是Python的Wheel包格式,通常用于方便和...

    AA_stat-2.5-py3-none-any.whl.zip

    标题 "AA_stat-2.5-py3-none-any.whl.zip" 暗示这是一个包含Python软件包的压缩文件,具体来说,它封装了一个名为 "AA_stat" 的版本为2.5的Python软件轮子(wheel)文件。Python轮子文件是一种预编译的Python包格式...

    trace_stat.rar_trace

    1. **函数原型**:如`void trace_stat_init()`用于初始化,`void trace_event(int event_id, uint64_t timestamp)`用于记录事件,`void print_histogram()`用于打印直方图。 2. **数据结构声明**:如`struct ...

    AA_stat-2.5.2-py3-none-any.whl.zip

    标题 "AA_stat-2.5.2-py3-none-any.whl.zip" 暗示了这是一个Python软件包,名为AA_stat,版本为2.5.2,它被打包成一个`.whl`文件,这是一种预编译的Python轮子(Wheel)格式,用于简化安装过程。`py3-none-any`表明...

    ubuntu18.04版本以上系统编译君正软件包问题解决方案及相应软件包

    STAT_VER’ undeclared 错误,如采用网上通用的直接宏定义_STAT_VER方法虽也可以编译通过,但最后生成的文件系统大概率为非root用户,系统随可启动,但是相关命令运行及proc文件系统挂在等都存在问题。 其他嵌入式...

    AA_stat-2.3-py3-none-any.whl.zip

    在压缩包内的文件名列表中,"使用说明.txt" 提供了有关如何安装和使用AA_stat库的指导,这通常是开发者为了帮助用户更好地理解和操作库而提供的文档。另一方面,"AA_stat-2.3-py3-none-any.whl" 是实际的Python轮子...

    AA_stat-2.4-py3-none-any.whl.zip

    因此,要使用这个AA_stat库,首先需要解压AA_stat-2.4-py3-none-any.whl.zip,然后在命令行中找到包含.whl文件的目录,并使用pip进行安装。如果需要了解具体用法,可以查阅"使用说明.txt"。在Python项目中导入AA_...

    pg_script.tar.gz

    当遇到问题时,查看日志文件(默认为`pg_log`目录下的文件),使用`pg_ctl status`检查服务状态,或利用`pg_stat_replication`视图监控复制状态,都是常用的排查手段。 理解并掌握上述知识点,对于管理和维护一个...

Global site tag (gtag.js) - Google Analytics