CodeGym /课程 /SQL SELF /介绍 pg_stat_statements:扩展的安装和配置

介绍 pg_stat_statements:扩展的安装和配置

SQL SELF
第 42 级 , 课程 1
可用

PostgreSQL 里的 pg_stat_statements 扩展是用来收集查询统计信息的工具。它能让你看到哪些查询最常被执行,哪些查询最耗时,以及数据库资源用得怎么样。你不用再用 EXPLAIN 手动分析每个查询,而是可以直接看到数据库整体的性能状况。

pg_stat_statements 的好处:

实时监控:你可以直接看到现在哪些查询在给数据库带来压力。

全局性能分析:所有查询的信息都能看到,不用手动挑着分析。

查找慢查询:很容易就能找出最耗时的查询。

发现重复查询:可以优化缓存,给热门查询加索引。

安装和配置 pg_stat_statements

现在你已经知道 pg_stat_statements 有啥用了,下面我们一步步来看看怎么安装和配置它。

1. 检查 PostgreSQL 是否支持。 先确认你的 PostgreSQL 支持 pg_stat_statements 扩展。从 PostgreSQL 9.2 开始,这个扩展就是标配了。要检查扩展有没有装,执行:

SELECT extname FROM pg_extension;

如果 pg_stat_statements 不在列表里,说明管理员还没装它。

装好并激活扩展后,应该是这样的:

extname
plpgsql
pg_stat_statements
注意!

我们现在学的是 PostgreSQL 17.5,所以没问题。但你以后去公司上班,可没人保证用的是最新版服务器。说不定已经 10 年没人升级过了。毕竟程序员的头号原则是啥?能用就别动。

2. 添加扩展。

要激活 pg_stat_statements,得把它加到 PostgreSQL 的预加载库列表里。这要在 postgresql.conf 配置文件里设置。

步骤如下:

  1. 找到 postgresql.conf 文件。一般在 PostgreSQL 的数据目录下。
  2. 打开它编辑。
  3. 加上或修改这一行:
   shared_preload_libraries = 'pg_stat_statements'

为啥要这样?因为 pg_stat_statements 需要预加载,才能在系统层面跟踪查询。

  1. 保存后重启 PostgreSQL 服务器,让设置生效。Linux 下命令如下:

    sudo systemctl restart postgresql
    

如果你本地开发或测试,直接重启服务器也行。

3. 在数据库里创建扩展。 PostgreSQL 服务器重启后,我们可以在具体的数据库里创建 pg_stat_statements 扩展。用 psql 或别的工具连上目标数据库,执行:

CREATE EXTENSION pg_stat_statements;

如果没报错,说明扩展已经激活了。

4. 配置 pg_stat_statements 参数。

装好扩展后,最好配置下参数,保证统计数据收集得更准确。主要参数可以在 postgresql.conf 文件里设置。

主要参数

  • pg_stat_statements.track
  • 决定哪些查询会被跟踪。
  • 可选值:
    • all — 跟踪所有查询(调试和分析推荐)。
    • top — 只跟踪顶层查询。
    • none — 不跟踪。
  • 配置示例:
pg_stat_statements.track = 'all'
  • pg_stat_statements.max

    • 设置统计里最多能保存多少条查询。
    • 默认:5000。
    • 如果你系统查询很多,可以调大,比如:
      pg_stat_statements.max = 10000
      
  • pg_stat_statements.save

    • 决定重启服务器后统计数据要不要保留。
    • 可选值:onoff
    • 建议保持 on
      pg_stat_statements.save = on
      

改完参数后,再重启一次 PostgreSQL 服务器。

检查 pg_stat_statements 是否正常

扩展装好并配置后,我们来看看它是不是在正常工作。要看收集到的查询统计,执行下面这个查询:

SELECT
    queryid,        -- 查询的唯一标识
    query,          -- 查询文本
    calls,          -- 查询被调用的次数
    total_time,     -- 总执行时间(毫秒)
    rows            -- 查询返回的行数
FROM pg_stat_statements
ORDER BY total_time DESC;

这些字段都啥意思?

  • queryid:查询的唯一 ID,方便找出参数不同但结构一样的查询。
  • query:执行过的 SQL 查询文本。
  • calls:这个查询被执行了多少次。
  • total_time:所有调用加起来的总耗时。
  • rows:查询一共返回了多少行。

比如你看到某个查询 calls = 100total_time = 50000(50 秒),那它就是系统里最耗时的,得赶紧优化。

pg_stat_statements 的常见用法

  1. 查找最慢的查询。 要找出最耗时的查询,把结果按 total_time 排序:
SELECT query, total_time, calls
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 5;
  1. 找出最活跃的查询。 要看哪些查询最常被执行,用 calls 排序:
SELECT query, calls, total_time
FROM pg_stat_statements
ORDER BY calls DESC
LIMIT 5;
  1. 分析索引使用情况。 如果你发现很多查询很慢,检查下索引用得好不好。比如有 WHERE 过滤条件但没索引,性能肯定差。

清空 pg_stat_statements 的数据

有时候你想把统计数据清零,重新开始分析。可以用这个命令:

SELECT pg_stat_statements_reset();

清空后,所有统计都会被重置,数据会重新收集。

实用建议

限制统计数据量:如果你在高并发系统里,每天有几百万条查询,pg_stat_statements.max 别设太大,避免额外负担。

定期清理统计:分析性能前最好先清空统计,别让旧数据干扰新分析。

关注慢查询:哪怕某些慢查询很少出现,一次慢查询也可能让数据库压力山大。

现在你已经知道怎么安装、配置和用 pg_stat_statements 扩展来分析查询性能了。下一节课我们会深入讲怎么用它找出慢查询并优化它们的执行。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION