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

相关推荐
ACRELKY18 小时前
光伏运维迎来云端革命!AcrelCloud-1200如何破解分布式光伏四大痛点?
运维·分布式
阿里小阿希19 小时前
Vue3 + Element Plus 项目中日期时间处理的最佳实践与数据库设计规范
数据库·设计规范
白鹭20 小时前
MySQL源码部署(rhel7)
数据库·mysql
星期天要睡觉20 小时前
Linux 综合练习
linux·运维·服务器
666和77721 小时前
Struts2 工作总结
java·数据库
saynaihe21 小时前
proxmox8升级到proxmox9
linux·运维·服务器
还听珊瑚海吗21 小时前
SpringMVC(一)
数据库
Delphi菜鸟21 小时前
docker 部署RustDesk服务
运维·docker·容器
Orchestrator_me21 小时前
CentOS交换区处理
linux·运维·centos
FLS16821 小时前
VMwaer虚拟机安装完Centos后无法联网问题
linux·运维·centos