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. 克隆仓库

    bash 复制代码
    git clone https://github.com/ossc-db/pg_store_plans.git
    cd pg_store_plans
  2. 编译和安装

    bash 复制代码
    make
    sudo make install

配置 pg_store_plans

  1. 加载扩展

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

    plaintext 复制代码
    shared_preload_libraries = 'pg_store_plans'
    pg_store_plans.plan_format = 'json'  # 可选值: 'text', 'json'

    重启 PostgreSQL 服务以加载扩展:

    bash 复制代码
    sudo systemctl restart postgresql
  2. 在数据库中创建扩展

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

    sql 复制代码
    CREATE EXTENSION pg_store_plans;

使用 pg_store_plans

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

查看捕获的执行计划

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

sql 复制代码
SELECT * FROM pg_catalog.pg_store_plans;
检查执行计划

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

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

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

sql 复制代码
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. 创建一个示例表并插入数据:

    sql 复制代码
    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 语句,以便捕获执行计划:

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

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

    sql 复制代码
    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 可以显著提高数据库性能监控和优化的效率。然而,在启用前需要充分评估其性能影响,并定期维护存储的数据。

相关推荐
阿童木写作17 分钟前
Python实现Temu图片批量翻译自动化教程
运维·人工智能·python·自动化
@insist1231 小时前
信息系统管理工程师-信息系统运维资源、技术与智能运维核心考点解析
运维·软考·信管·软件水平考试·信息系统管理工程师
木子欢儿2 小时前
Intel 架构的 MacBook Pro 运行 Linux 发热量高解决
linux·运维·服务器
凌虚2 小时前
面向 MySQL 用户的 PostgreSQL 快速上手指南
数据库·后端·架构
五阿哥永琪2 小时前
MySQL中操作json的函数!
数据库·mysql·json
来者皆善2 小时前
了解Mysql优化吗?如何优化索引?
数据库·mysql
KKKlucifer4 小时前
运营商全域安全运维支撑体系落地实践
运维·安全
赤壁小虾4 小时前
【渲染流水线】[逐片元阶段]-[透明度测试]以UnityURP为例
java·前端·数据库
EAIReport4 小时前
工业电气自动化数据治理破局:多Agent大模型赋能全景智能决策
大数据·运维·自动化
MC皮蛋侠客4 小时前
SQLAlchemy 系列(七):高级建模与高效写入——批量 DML、方言与扩展
数据库·python