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

PostgreSQL的扩展(extensions)-常用的扩展之pg_store_plans

PostgreSQL的扩展(extensions)-常用的扩展之pg_store_plans

pg_store_plans 是一个 PostgreSQL 扩展,用于捕获查询执行计划(execution plans)并将其存储在数据库中。通过存储和分析这些执行计划,数据库管理员和开发者可以更好地了解查询的性能特征,并进行优化。这个扩展非常适用于监控查询性能、诊断慢查询以及跟踪执行计划的变化。

安装 pg_store_plans

在安装 pg_store_plans 之前,需要确保已经安装了 PostgreSQL 的开发包(例如 libpq-devpostgresql-server-dev-X.Y),这样才能编译和安装扩展。

从源码安装

首先,从 pg_store_plans 的官方 GitHub 项目下载源码并进行编译安装。

  1. 克隆仓库

    git clone https://github.com/ossc-db/pg_store_plans.git
    cd pg_store_plans
    
  2. 编译和安装

    make
    sudo make install
    

配置 pg_store_plans

  1. 加载扩展

    在 PostgreSQL 配置文件 postgresql.conf 中添加或修改以下配置:

    shared_preload_libraries = 'pg_store_plans'
    pg_store_plans.plan_format = 'json'  # 可选值: 'text', 'json'
    

    重启 PostgreSQL 服务以加载扩展:

    sudo systemctl restart postgresql
    
  2. 在数据库中创建扩展

    使用 psql 或其他 PostgreSQL 客户端连接到数据库,并执行以下 SQL 命令以创建扩展:

    CREATE EXTENSION pg_store_plans;
    

使用 pg_store_plans

pg_store_plans 会自动捕获查询执行计划并将其存储在系统的专用表中。通常,这些表位于 pg_catalog 模式下。

查看捕获的执行计划

捕获的执行计划存储在 pg_catalog.pg_store_plans 表中。你可以查询这个表来查看存储的计划。

SELECT * FROM pg_catalog.pg_store_plans;
检查执行计划

展示具体的执行计划信息,比如查询的哈希值、执行计划的 JSON 结构等。

SELECT queryid, query, plan FROM pg_catalog.pg_store_plans WHERE queryid = 'your_queryid_here';
统计和分析查询

你可以根据不同需要来统计查询的执行计划信息。例如,可以按查询 ID 汇总信息,以找到执行时间最长的查询:

SELECT queryid, min(run_total_time) as min_time,max(run_total_time) as max_time,avg(run_total_time) as avg_time,count(*) as executions
FROM pg_catalog.pg_store_plans
WHERE queryid IS NOT NULL
GROUP BY queryid
ORDER BY avg_time DESC
LIMIT 10;

示例

下面是一个完整的示例,展示如何使用 pg_store_plans 来捕获、存储并分析查询的执行计划。

  1. 创建一个示例表并插入数据:

    CREATE TABLE employees (id SERIAL PRIMARY KEY,name VARCHAR(100),department_id INT
    );INSERT INTO employees (name, department_id)
    SELECT 'Employee ' || g, g % 10 FROM generate_series(1, 10000) g;
    
  2. 执行一个带有复杂查询的 SQL 语句,以便捕获执行计划:

    EXPLAIN ANALYZE SELECT * FROM employees WHERE department_id = 1;
    
  3. 查看存储在 pg_store_plans 表中的执行计划:

    SELECT * FROM pg_catalog.pg_store_plans WHERE query LIKE '%SELECT * FROM employees WHERE department_id = 1%';
    
  4. 分析查询的执行计划信息:

    SELECT queryid, planid, plan FROM pg_catalog.pg_store_plans WHERE queryid = 'your_queryid_here';
    

    这将返回查询的执行计划 JSON 结构,你可以进一步解析和分析它。

注意事项

  1. 性能开销:启用 pg_store_plans 可能会引入一些性能开销,特别是在高负载的生产环境中。建议在测试环境中验证其影响,并适当配置捕获规则。
  2. 存储空间:由于捕获并存储了大量的执行计划,可能会占用较多存储空间。需要定期清理或归档旧的执行计划数据。
  3. 版本兼容性:确保 pg_store_plans 的版本与 PostgreSQL 服务器版本兼容。
  4. 安全性:存储的查询和执行计划可能包含敏感数据,确保适当的安全措施以防止未授权访问。

总结

pg_store_plans 是一个强大的 PostgreSQL 扩展,提供了捕获并存储查询执行计划的功能。通过存储和分析执行计划,数据库管理员和开发者可以深入了解查询的性能表现,并能够有针对性地优化复杂查询。通过正确的安装、配置和使用,pg_store_plans 可以显著提高数据库性能监控和优化的效率。然而,在启用前需要充分评估其性能影响,并定期维护存储的数据。

相关文章:

  • Windows系统使用Docker部署Focalboard团队协作工具详细流程
  • 521源码-免费下载-WordPress全能自动采集与发布插件 – WP-AutoPostPro 汉化版
  • Docker搭建mysql性能测试环境
  • 授人以渔 选购篇十四:电动车(电动自行车)选购要点
  • 重生之while在鸣潮学习HTML标签
  • 【ai】pycharm设置软件仓库编译运行基于langchain的chatpdf
  • 疯狂“造人”!美国两党共推新法案,5年培养100万AI及量子人才
  • 推荐3款好用的AI智能写作工具
  • 【算法专题】双指针算法之 移动零
  • Qt for android 串口库使用
  • 国产32位MCU的发展与机遇
  • 【数组】Leetcode 57. 插入区间【中等】
  • 【计算机视觉(2)】
  • 【LeetCode算法】第83题:删除排序链表中的重复元素
  • 一文搞透常见的Python编码陷阱(上)(分析+案例)
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • Java IO学习笔记一
  • Linux Process Manage
  • Netty 4.1 源代码学习:线程模型
  • React-flux杂记
  • 编写高质量JavaScript代码之并发
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 分布式事物理论与实践
  • 前端路由实现-history
  • 人脸识别最新开发经验demo
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 一道面试题引发的“血案”
  • # windows 安装 mysql 显示 no packages found 解决方法
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (03)光刻——半导体电路的绘制
  • (11)MSP430F5529 定时器B
  • (9)STL算法之逆转旋转
  • (ZT)一个美国文科博士的YardLife
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (每日一问)基础知识:堆与栈的区别
  • (算法二)滑动窗口
  • (转)视频码率,帧率和分辨率的联系与区别
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET C# 操作Neo4j图数据库
  • .NET gRPC 和RESTful简单对比
  • .net 获取url的方法
  • .NET分布式缓存Memcached从入门到实战
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [\u4e00-\u9fa5] //匹配中文字符
  • [1]从概念到实践:电商智能助手在AI Agent技术驱动下的落地实战案例深度剖析(AI Agent技术打造个性化、智能化的用户助手)
  • [100天算法】-不同路径 III(day 73)
  • [2024-06]-[大模型]-[Ollama]- WebUI