暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

postgresql扩展 类oracle awr之扩展pg_profile

原创 贾勇智 2022-04-24
3131

功能:

  • 找出 PostgreSQL 数据库中最消耗资源的活动。

特征:

  • 依赖扩展pg_stat_statements与dblink
  • pl/pgsql 编写的,不需要任何外部库或软件,只需要 PostgreSQL 库本身,以及类似 cron 的工具
  • 兼容 PostgreSQL 9.6 ,早期版本或不兼容
  • 如果扩展pg_stat_kcache可用;则可记录有关SQL语句 CPU 使用率和文件系统负载的信息
  • pg_profile在数据库中创建历史存储库,用以存储 postgres 集群统计“samples”,通过调用 take_sample() 函数获取样本。 样本的采集需要使用 系统cron脚本或作业高度扩展pg_timetable
  • pg_profile 通过dblink扩展可以收集其它postgresql集群的统计信息

架构

扩展有四部分:

  • 历史存储库:是采样数据的存储。存储库是一组扩展表。
  • 样本管理引擎:是一组函数,用于支持采样和通过删除过旧的样本数据支持存储库
  • 报表引擎:是一组用于根据历史存储库中的数据生成报表的功能。
  • 管理功能:允许创建和管理服务器和基线。

开启统计参数

考虑设置以下统计收集器参数:

track_activities = on
track_counts = on
track_io_timing = on
track_wal_io_timing = on      # Since Postgres 14
track_functions = all/pl
#  pg_stat_statements 
pg_stat_statements.max = 5000
pg_stat_statements.track = 'top' 

下载地址:

  • https://github.com/zubkov-andrei/pg_profile.git

安装

步骤1: 安装扩展文件

tar xzf pg_profile-.tar.gz --directory $(pg_config --sharedir)/extension

步骤2: 安装创建扩展

安装在数据库的 public schema 中:

CREATE EXTENSION dblink;
CREATE EXTENSION pg_stat_statements;
CREATE EXTENSION pg_profile;

如想在其他schema中安装 pg_profile,只需创建它,然后在该schema中安装扩展:

postgres=# CREATE EXTENSION dblink;
postgres=# CREATE EXTENSION pg_stat_statements;
postgres=# CREATE SCHEMA profile;
postgres=# CREATE EXTENSION pg_profile SCHEMA  profile;

所有对象都将在由 SCHEMA 子句定义的 SCHEMA 中创建。
推荐以专用schema 安装 - 扩展将创建自己的表、视图、序列和函数。将它们分开是个好主意。如果您不想在使用模块时指定schema限定符,请考虑更改 search_path 设置。

步骤3: 更新到新版本

新版本的 pg_profile 将包含迁移脚本(如果可能)。因此在更新时,只安装扩展文件(参见步骤 1)并更新扩展,如下所示:

ALTER EXTENSION pg_profile UPDATE;

权限

使用具有超级用户权限的 pg_profile 没有任何问题,但是如果你想避免使用超级用户权限,这里是指南:

On pg_profile database

- 创建非特权用户:

create role profile_usr login password 'pwd';

- 为 pg_profile 安装创建一个schema :

create schema profile authorization profile_usr;

- 授予 dblink 扩展所在架构的使用权限:

grant usage on schema public to profile_usr;

- 使用 profile_usr 帐户创建扩展:

create extension pg_profile schema profile;

On server database

为 pg_profile 创建一个用户以进行连接:

create role profile_mon login password 'pwd_mon';

确保此用户有权连接到集群中的任何数据库,并且 pg_hba.conf 将允许来自 pg_profile 数据库主机
的此类连接。此外,我们需要 pg_read_all_stats 权限,并在 pg_stat_statements_reset 上执行权限:

grant pg_read_all_stats to profile_mon;
grant execute on function pg_stat_statements_reset TO profile_mon;

pg_profile 数据库中的服务器设置

非超级用户无法在没有密码的情况下建立连接。提供密码的最佳方式是使用密码文件。

注: pg_profile 将连接到服务器上的所有数据库,因此密码文件必须使用通配符作为数据库名称。

作为一种不安全的方式,您可以在连接字符串中提供密码:

select server_connstr('local','dbname=postgres port=5432 user=profile_mon password=pwd_mon');

使用 pg_profile

设置扩展参数

您可以在 postgresql.conf 中定义扩展参数。默认值:

pg_profile.topn = 20

  • 要在每个排序报告表中报告的顶级对象(语句、关系等)的数量。此外,此参数会影响样本的大小
  • 您希望在报告中出现的对象越多,我们需要在样本中保留的对象就越多。
    pg_profile.max_sample_age = 7
  • 样品的保留时间(以天为单位)。样本、老化的 pg_profile.max_sample_age 天数等将在下一次 take_sample() 调用时自动删除。
    pg_profile.track_sample_timings = off
  • 当这个参数打开时,pg_profile 将跟踪详细的采样时间。
    pg_profile.max_query_length = 20000
  • 报告的查询长度限制。报告中的所有查询都将被截断到这个长度。此设置不影响查询文本收集
  • 在示例期间收集完整的查询文本,因此可以获得。

管理服务器

安装后,扩展程序将创建一个启用的本地服务器 - 这是安装扩展程序的集群。

服务器管理功能:

  • create_server(server name, server_connstr text, server_enabled boolean = TRUE, max_sample_age integer = NULL, description text = NULL)

    • 创建一个新的服务器描述函数参数:
      • server - 服务器名称(必须是唯一的)
      • server_connstr - 服务器连接字符串
      • enabled - 服务器启用标志。设置时,服务器将包含在常见的 take_sample() 调用中
      • max_sample_age - 服务器样本保留参数覆盖此服务器的全局 pg_profile.max_sample_age 设置
      • description - 服务器描述文本。将包含在报告中
      • drop_server(server name) 删除服务器及其所有样本。
  • enable_server(server name) 在普通的 take_sample() 调用中包含 server。

  • disable_server(server name) 从常见的 take_sample() 调用中排除服务器。

  • rename_server(server name, new_name name) 重命名服务器。

  • set_server_max_sample_age(server name, max_sample_age integer) 为服务器设置新的保留期(以天为单位)。 max_sample_age 是整数值。要重置服务器 max_sample_age 设置,请将其设置为 NULL。

  • set_server_db_exclude(server name, exclude_db name[]) 为服务器设置排除数据库列表。用于无法连接到集群中的某些数据库(例如在 Amazon RDS 实例中)的情况。

  • set_server_connstr(server name, new_connstr text) 为服务器设置新的连接字符串。

  • set_server_description(server name, description text) 设置新的服务器描述。

  • show_servers() 显示现有服务器。

服务器创建示例:

SELECT profile.create_server('omega','host=name_or_ip dbname=postgres port=5432');

罕见的关系大小集合 - Rare relation sizes collection

Postgres relation大小函数可能需要相当长的时间来收集数据库中所有relation的大小。这些函数也需要relation上的 AccessExclusiveLock。但是,每日relation大小收集对您来说可能已经足够了。pg_profile 能够跳过关系大小收集,当通过服务器大小收集策略采样时。当允许收集关系大小,策略定义为每日窗口,收集关系大小的两个样本之间的最小差距。因此,当定义了大小收集策略时,采样函数将仅在在窗口中采样并且前一个具有大小的样本比间隙更旧时收集关系大小。仅当以收集的样本为界时,才能在报告中使用增长最快的表格/索引报告部分。请参阅 get_report 函数描述的 with_growth 参数以获取更多参考。

函数 set_server_size_sampling 定义了大小收集策略:

  • set_server_size_sampling(server name, window_start time with time zone = NULL, window_duration interval hour to second = NULL, sample_interval interval day to minute = NULL)
    • server - server name
    • window_start - size collection window start time
    • window_duration - size collection window duration
    • sample_interval - minimum time gap between two samples with relation sizes collected

例子:

SELECT set_server_size_sampling('local','23:00+03',interval '2 hour',interval '8 hour');

函数 show_servers_size_sampling 显示所有服务器的定义大小收集策略:

postgres=# SELECT * FROM show_servers_size_sampling();
 server_name | window_start | window_end  | window_duration | sample_interval
-------------+--------------+-------------+-----------------+-----------------
 local       | 23:00:00+03  | 01:00:00+03 | 02:00:00        | 08:00:00

当您在缺少关系大小数据的样本之间构建报告时,报告的关系增长部分将基于 pg_class.relpages 数据。但是,报告生成函数的 with_growth 参数会将报告范围扩展到最近的样本,其中收集了关系大小数据,并且增长数据将更加准确。

样本

每个样本都包含自上一个样本以来数据库工作负载的统计信息。

样本函数

  • take_sample() 函数 take_sample() 将为所有启用的服务器收集样本。服务器样本将一个个连续采集。函数返回一个表:
    server name,
    result text,
    elapsed interval
    Where:
    • server is a server name
    • result 是取样的结果。 如果连续采样可以是“OK”,并且在异常情况下将包含错误文本
    • elapsed 是为服务器采集样本的时间。这样的返回使得使用 SQL 查询控制样本创建变得容易。
  • take_sample_subset([sets_cnt integer], [current_set integer]) 由于串行样本处理 take_sample() 函数可能需要相当长的时间。函数 take_sample_subset() 将为启用的服务器的子集采样。便于平行样品采集。 sets_cnt 是服务器子集的数量。 current_set 是要处理的子集,取值介于 0 和 sets_cnt - 1 之间。函数返回一个表:
    server name,
    result text,
    elapsed interval
    Where:
    • server is a server name
    • result 结果是取样的结果。如果连续采样可以是“OK”,并且在异常情况下将包含错误文本
    • elapsed 是为服务器采样所经过的时间
  • take_sample(server name [, skip_sizes boolean]) 将为指定服务器收集样本。例如,当您想使用不同的采样频率,或者如果您想在服务器上进行显式采样时,请使用它。
    • server - name of a server to take sample
    • skip_sizes - 覆盖服务器关系大小收集策略。仅当忽略 skip_size 参数或设置为 null 时,策略才适用。 skip_sizes = false 导致使用关系大小进行采样,而 true 将导致在采样期间跳过关系大小收集。
  • show_samples([server name,] [days integer]) 返回一个表,其中包含服务器的现有样本(如果省略服务器,则假定为本地服务器)最后几天(如果省略,则所有现有样本):
    sample integer,
    sample_time timestamp (0) with time zone,
    sizes_collected boolean,
    dbstats_reset timestamp (0) with time zone,
    clustats_reset timestamp (0) with time zone,
    archstats_reset timestamp (0) with time zone
    Where:
  • sample 是一个样本标识符
  • sample_time 是采集此样本的时间
  • sizes_collected 如果在此示例中收集了所有关系大小,则设置
  • dbstats_reset, clustats_reset and archstats_reset 通常为空, 但将包含 pg_stat_database、pg_stat_bgwriter 和 pg_stat_archiver 统计重置时间戳,如果它发生,因为以前的样本样本收集函数也支持服务器存储库 - 它将删除与保留策略有关的过时样本和基线。

取样

您必须创建至少 2 个样本才能在第 1 个和第 2 个样本之间构建您的第一个报告。通过调用 take_sample() 函数获取所有启用的服务器的样本。无需频繁创建样本——通常的基本频率是每小时一到两个样本。您可以使用类似 cron 的工具来安排示例创建。以 30 分钟为周期的示例:

*/30 * * * *   psql -c 'SELECT profile.take_sample()' > /dev/null 2>&1

但是,这样的调用对 take_sample() 函数结果没有错误检查。考虑使用更智能的 take_sample() 函数,为您的监控系统提供结果。

函数将为成功采集样本的所有服务器返回“OK”,并为失败的服务器显示错误文本:

select * from take_sample();
  server   |                                   result                                    |   elapsed
-----------+-----------------------------------------------------------------------------+-------------
 ok_node   | OK                                                                          | 00:00:00.48
 fail_node | could not establish connection                                             +| 00:00:00
           | SQL statement "SELECT dblink_connect('server_connection',server_connstr)"  +|
           | PL/pgSQL function take_sample(integer) line 69 at PERFORM                  +|
           | PL/pgSQL function take_sample_subset(integer,integer) line 27 at assignment+|
           | SQL function "take_sample" statement 1                                     +|
           | FATAL:  database "nodb" does not exist                                      |
(2 rows)

样本数据保留 - Sample data retention

我们不能永远存储样本数据,因此我们有保留政策。您可以在三个级别上定义保留:

  • 在 postgresql.conf 文件中设置参数 pg_profile.max_sample_age。这是一种常见的保留,如果没有定义其他保留,则它是有效的。
  • 在创建服务器时定义服务器 max_sample_age 设置,或对现有服务器使用 set_server_max_sample_age() 函数。此设置覆盖特定服务器的全局 pg_profile.max_sample_age 设置。
  • 创建基线(见下文)。基线将覆盖具有最高优先级的包含样本的保留期。

列出样本

使用 show_samples() 函数获取存储库中现有示例的列表。此功能将显示检测到的统计重置时间。

采样时间 - Sample taking timings

pg_profile 将在参数 pg_profile.track_sample_timings 开启时收集详细的采样计时统计信息。结果可以从 v_sample_timings 视图中获得。
v_sample_timings 字段说明:

  • server_name - sampled server name
  • sample_id - sample identifier
  • sample_time - when the sample was taken
  • event - sample taking stage
  • time_spent - amount of time spent in the event

Event descriptions:

  • total - Taking the sample (all stages).取样(所有阶段)。
  • connect - Making dblink connection to the server.与服务器建立 dblink 连接。
  • get server environment - Getting server GUC parameters, available extensions, etc.
  • collect database stats - Querying the pg_stat_database view for statistics on databases.
  • calculate database stats - Calculating differential statistics on databases since the previous sample.
  • collect tablespace stats - Querying the pg_tablespace view for statistics on tablespaces.
  • collect statement stats - Collecting statistics on statements using the pg_stat_statements and pg_stat_kcache extensions.
  • query pg_stat_bgwriter - Collecting cluster statistics using the pg_stat_bgwriter view.
  • query pg_stat_wal - Collecting cluster WAL statistics using the pg_stat_wal view. 使用 pg_stat_wal 视图收集集群 WAL 统计信息。
  • query pg_stat_archiver - Collecting cluster statistics using the pg_stat_archiver view.使用 pg_stat_archiver 视图收集集群统计信息。
  • collect object stats - Collecting statistics on database objects. Includes following events:
    • db:dbname collect tables stats - Collecting statistics on tables for the dbname database.
      • db:dbname collect limited table sizes - Collecting vacuumed or sequentially scanned table sizes when sizes collection is disabled.
    • db:dbname collect indexes stats - Collecting statistics on indexes for the dbname database.
      • db:dbname collect limited index sizes - Collecting index sizes for vacuumed tables when sizes collection is disabled.
    • db:dbname collect functions stats - Collecting statistics on functions for the dbname database.
  • maintain repository - Executing support routines.执行支持例程。
  • calculate tablespace stats - Calculating differential statistics on tablespaces.计算表空间的差异统计信息。
  • calculate object stats - Calculating differential statistics on database objects. Includes following events:计算数据库对象的差异统计。包括以下事件:
    • calculate tables stats - Calculating differential statistics on tables of all databases.
    • calculate indexes stats - Calculating differential statistics on indexes of all databases.
    • calculate functions stats - Calculating differential statistics on functions of all databases.
  • calculate cluster stats - Calculating cluster differential statistics.计算集群差异统计。
  • calculate archiver stats - Calculating archiever differential statistics.计算归档差异统计。
  • delete obsolete samples - Deleting obsolete baselines and samples.删除过时的基线和样本。

基线

基线是一个命名的样本序列,具有自己的保留设置。基线可以在构建报表功能中用作采样间隔。未定义的基线保留意味着无限保留。您可以使用基线在特定时间段内保存有关数据库工作负载的信息。例如,您可能想要保存在负载测试期间收集的样本,或在系统上常规负载以进行进一步参考。基线管理函数:

  • create_baseline([server name,] baseline_name varchar(25), start_id integer, end_id integer [, days integer]) - 创建基线

    • server - server name. 如果省略,则假定为本地服务器
    • name - baseline name. 每个基线在服务器中必须具有唯一的名称。
    • start_id, end_id - 第一个和最后一个样本,包含在基线中。
    • days - 基线保留时间。 从 now() 开始以整数天数定义。此参数可以省略(或设置为 null),表示无限保留。
  • create_baseline([server name,] baseline_name varchar(25), time_range tstzrange [, days integer]) - 创建基线

    • server - server name. 如果省略,则假定为本地服务器
    • name - baseline name. 每个基线在服务器中必须具有唯一的名称。
    • time_range - 基线时间间隔。基线将包括所有可用样本,与此间隔重叠。
    • days - 基线保留时间。从 now() 开始以整数天数定义。该参数可以省略(或设置为空),表示无限保留。
  • drop_baseline([server name,] name varchar(25)) - drop a baseline

    • server - server name. 如果省略,则假定为本地服务器
    • name - 要删除的基线名称。放弃基线并不意味着立即放弃其所有样本,它们只是被排除在基线之外,因此没有更多地被基线保留所覆盖。
  • keep_baseline([server name,] name varchar(25) [, days integer]) - change retention of baselines

    • server - server name. 如果省略,则假定为本地服务器
    • name - 基线名称。此参数可以省略(或设置为空)以更改所有现有基线的保留。
    • days - 自 now() 以来基线的保留时间(以天为单位)。此外,可以省略(或设置为 null)以设置无限保留。
  • show_baselines([server name]) - displays existing baselines. Call this function to get information about existing baselines (names, sample intervals, and retention times)

    • server - server name. 如果省略,则假定为本地服务器
postgres=# SELECT * FROM profile.baseline_show('local');

数据导出和导入 - Data export and import

收集的样本可以从 pg_profile 扩展的实例中导出,然后加载到另一个中。当您想要将服务器从一个实例移动到另一个实例时,或者当您需要将收集的数据发送给您的支持团队时,此功能非常有用。

数据导出

数据通过函数 export_data() 导出为常规表。您可以使用任何方法从数据库中导出此表。例如,您可以使用 psql 的复制命令来获取单个 .csv 文件:

postgres=# \copy (select * from export_data()) to 'export.csv'

默认情况下 export_data() 函数将导出所有已配置服务器的所有样本。但是,您可以将导出限制为仅一台服务器,并进一步限制样本范围

  • export_data([server name, [min_sample_id integer,] [max_sample_id integer]] [, obfuscate_queries boolean]) - export collected data
    • server is a server name. 如果省略,则假定所有服务器
    • min_sample_id and max_sample_id - export bounding sample identifiers (inclusive). min_sample_id bound 的 null 值导致导出所有样本直到 max_sample_id,而 max_sample_id 的 null 值导致导出 min_sample_id 之后的所有样本。
    • obfuscate_queries - 仅当您想隐藏查询文本时才使用此参数 - 它们将导出为 MD5 哈希。

数据导入

数据只能从本地表中导入,因此需要先加载之前导出的数据。在我们使用复制命令的情况下:

postgres=# CREATE TABLE import (section_id bigint, row_data json);
CREATE TABLE
postgres=# \copy import from 'export.csv'
COPY 6437

现在我们可以执行数据导入,将此表提供给 import_data() 函数:

postgres=# SELECT * FROM import_data('import');

虽然服务器描述也被导入,但你的本地 pg_profile 服务器名称匹配将禁止导入操作。考虑暂时重命名这些服务器。如果您需要为以前导入的服务器导入新数据,它们将与系统标识符匹配,因此您可以随意重命名导入的服务器。所有服务器都以禁用状态导入。 import_data() 函数只接受导入的表:

  • import_data(data regclass)
    • data - 包含导出数据的表 此函数返回扩展表中实际加载的行数。成功导入操作后,您可以删除导入表。

报告 - Reports

报告由报告函数以 HTML 标记生成。 pg_profile 中有两种类型的报告可用:

  • 定期报告,包含报告间隔内实例工作负载的统计信息
  • 差异报告,包含来自两个间隔的数据,具有相同的对象统计值并排放置,便于比较工作负载

定期报告函数 - Regular report functions

  • get_report([server name,] start_id integer, end_id integer [, description text [, with_growth boolean]]) - 按样本标识符生成报告
  • get_report([server name,] time_range tstzrange [, description text [, with_growth boolean]]) - 生成最短采样间隔的报告,涵盖提供的 time_range。
  • get_report([server name], baseline varchar(25) [, description text [, with_growth boolean]]) - 生成报告,使用基线作为样本间隔
  • get_report_latest([server name]) - 为两个最新示例函数参数生成报告:
    • server - 服务器名称。如果省略,则假定为本地服务器
    • start_id - 间隔开始样本标识符
    • end_id - 间隔结束样本标识符
    • time_range - 时间范围(tstzrange 类型)
    • baseline - 基线名称
    • with_growth - 一个标志,请求使用可用的关系增长数据将区间扩展到最近的边界。默认值为false
    • description - 文本备忘录,它将作为报告描述包含在报告中

差异报告函数

您可以使用样本标识符、基线和时间范围作为区间界限生成差异报告:

  • get_diffreport([server name,] start1_id integer, end1_id integer, start2_id integer, end2_id integer [, description text [, with_growth boolean]]) - 通过样本标识符生成两个区间的差异报告
  • get_diffreport([server name,] baseline1 varchar(25), baseline2 varchar(25) [, description text [, with_growth boolean]]) - 在两个间隔上生成差异报告,由基本名称定义
  • get_diffreport([server name,] time_range1 tstzrange, time_range2 tstzrange [, description text [, with_growth boolean]]) - 生成由时间范围定义的两个间隔的差异报告
    • server is server name. 如果省略,则假定为本地服务器
    • start1_id, end1_id - 第一个区间的充足标识符
    • start2_id, end2_id - 第二个区间的样本标识符
    • baseline1 - 第一个间隔的基线名称
    • baseline2 - 第二个间隔的基线名称
    • time_range1 - 第一个间隔时间范围
    • time_range2 - 第二个间隔时间范围
    • description is a text memo - 它将作为报告描述包含在报告中
    • with_growth is a flag, 请求两个区间扩展到最近的边界,并提供可用的关系增长数据。默认值为false
      此外,您可以使用上述的一些组合:
  • get_diffreport([server name,] baseline varchar(25), time_range tstzrange [, description text [, with_growth boolean]])
  • get_diffreport([server name,] time_range tstzrange, baseline varchar(25) [, description text [, with_growth boolean]])
  • get_diffreport([server name,] start1_id integer, end1_id integer, baseline varchar(25) [, description text [, with_growth boolean]])
  • get_diffreport([server name,] baseline varchar(25), start2_id integer, end2_id integer [, description text [, with_growth boolean]])

报告生成示例:

$ psql -Aqtc "SELECT profile.get_report(480,482)" -o report_480_482.html

对于任何其他服务器,使用它的名称:

$ psql -Aqtc "SELECT profile.get_report('omega',12,14)" -o report_omega_12_14.html

使用时间范围生成报告:

psql -Aqtc "select profile.get_report(tstzrange('2020-05-13 11:51:35+03','2020-05-13 11:52:18+03'))" -o report_range.html

此外,时间范围对于生成​​定期报告很有用。让我们构建最近的 24 小时报告:

psql -Aqtc "select profile.get_report(tstzrange(now() - interval '1 day',now()))" -o last24h_report.html

现在您可以使用任何网络浏览器查看报告文件。

报告内容

本节介绍了报告表及其列。

服务器统计

数据库统计

基于 pg_stat_database 视图,在报告间隔期间包含每个数据库的统计信息。

  • Database - database name
  • Transactions - database transaction statistics 数据库事务统计
    • Commits - 提交的事务数 (xact_commit)
    • Rollbacks - 回滚事务数 (xact_rollback)
    • Deadlocks - 检测到的死锁数(死锁)
  • Block statistics - 数据库块读取和命中统计信息
    • Hit(%) - 缓冲区高速缓存命中率
    • Read - 此数据库中读取的磁盘块数 (blks_read)
    • Hit - 已在缓冲区高速缓存中找到磁盘块的次数 (blks_hit)
  • Tuples - 元组统计部分
    • Ret - 返回的元组数(tup_returned)
    • Fet - 获取的元组数(tup_fetched)
    • Ins - 插入的元组计数 (tup_inserted)
    • Upd - 更新元组的数量 (tup_updated)
    • Del - 已删除元组的数量 (tup_deleted)
  • Temp files - 临时文件统计
    • Size - 此数据库中的查询写入临时文件的数据总量(temp_bytes)
    • Files - 此数据库中的查询创建的临时文件数 (temp_files)
  • Size - 报告间隔结束时的数据库大小 (pg_database_size())
  • Growth - 报告间隔期间的数据库增长(pg_database_size() 差异)

数据库会话统计

本节包含来自 pg_stat_database 视图的会话相关数据。从 Postgres 14 开始可用

  • Database - database name
  • Timings (s) - session timings in seconds
    • Total - 数据库会话在此数据库中花费的时间(注意统计信息仅在会话状态发生变化时更新,因此如果会话长时间空闲,则不包括此空闲时间)(session_time)
    • Active - 在此数据库中执行 SQL 语句所花费的时间(这对应于 pg_stat_activity 中的状态 active 和 fastpath 函数调用)(active_time)
    • Idle(T) - 在此数据库中的事务中空闲的时间(这对应于 pg_stat_activity 中事务中的空闲状态和事务中的空闲(中止))(idle_in_transaction_time)
  • Sessions - 数据库的会话计数
    • Established - 建立到该数据库的会话总数(会话)
    • Abandoned - 由于与客户端的连接丢失而终止的与该数据库的数据库会话数 (sessions_abandoned)
    • Fatal - 因致命错误而终止的该数据库的数据库会话数 (sessions_fatal)
    • Killed - 由操作员干预终止的该数据库的数据库会话数 (sessions_killed)

数据库报表统计

包含 pg_stat_statements 数据的每个数据库汇总的总统计信息(如果 pg_stat_statements 扩展在报告间隔期间可用)

  • Database - database name
  • Calls - 所有语句执行的总数(调用总和)
  • Time (s) - 花费的时间(以秒为单位)
    • Plan - 计划花费的时间(total_plan_time 的总和) - 自 pg_stat_statements 1.8 起可用
    • Exec - 执行时间(total_time 或 total_exec_time 的总和)
    • Read - 读取块花费的时间(blk_read_time 的总和)
    • Write - 写入块的时间(blk_write_time 的总和)
    • Trg - 执行触发函数所花费的时间
  • Fetched (blk) - 从磁盘和缓冲区缓存中获取的总块数
    • Shared - 获取的共享块总数(shared_blks_read + shared_blks_hit 的总和)
    • Local - 获取的本地块总数(local_blks_read + local_blks_hit 的总和)
  • Dirtied (blk) - 数据库中的总块数
    • Shared - 数据库中被弄脏的共享块的总数(shared_blks_dirtied 的总和)
    • Local - 数据库中脏的本地块总数(local_blks_dirtied 的总和)
  • Temp (blk) - 用于操作的块(如连接和排序)
    • Read - 读取的块(temp_blks_read 的总和)
    • Write - 写入的块(temp_blks_written 的总和)
  • Local (blk) - 用于临时表的块
    • Read - 读取的块(local_blks_read 的总和)
    • Write - 写入的块(local_blks_written 的总和)
  • Statements - 捕获语句的总数
  • WAL size - 语句生成的 WAL 总量(wal_bytes 的总和)

集群统计

此表包含来自 pg_stat_bgwriter 视图的数据

  • Scheduled checkpoints - 由于 checkpoint_timeout 参数(checkpoints_timed 字段)按计划完成的检查点总数
  • Requested checkpoints - 其他检查点的总数:由于 max_wal_size、archive_timeout 和 CHECKPOINT 命令的值(checkpoints_req 字段)
  • Checkpoint write time (s) - 以秒为单位写入检查点的总时间(checkpoint_write_time 字段)
  • Checkpoint sync time (s) - 以秒为单位同步检查点所花费的总时间(checkpoint_sync_time 字段)
  • Checkpoints buffers written - 缓冲区总数,由检查点写入(buffers_checkpoint 字段)
  • Background buffers written - 由后台写入进程写入的缓冲区总数(buffers_clean 字段)
  • Backend buffers written - 由后端写入的缓冲区总数(buffers_backend 字段)
  • Backend fsync count - 后端 fsync 调用总数(buffers_backend_fsync 字段)
  • Bgwriter interrupts (too many buffers) - 由于达到 bgwriter_lru_maxpages 参数的值,后台写入器中断的总数。
  • Number of buffers allocated - 分配的缓冲区总数(buffers_alloc 字段)
  • WAL generated - 生成的 WAL 总量(基于 pg_current_wal_lsn() 差异)
  • WAL segments archived - 归档 WAL 段数(基于 pg_stat_archiver 视图的 archived_count)
  • WAL segments archive failed - WAL 段归档失败计数(基于 pg_stat_archiver 视图的 failed_count)

WAL 统计

此表包含来自 pg_stat_wal 视图的数据。从 Postgres 14 开始可用

WAL generated - 生成的 WAL 总量(wal_bytes)
WAL per second - 平均每秒生成的 WAL 数量
WAL records - 生成的 WAL 记录总数 (wal_records)
WAL FPI - 生成的 WAL 整页图像总数 (wal_fpi)
WAL buffers full - 由于 WAL 缓冲区已满(wal_buffers_full)而将 WAL 数据写入磁盘的次数
WAL writes - 通过 XLogWrite 请求 (wal_write) 将 WAL 缓冲区写入磁盘的次数
WAL writes per second - 每秒通过 XLogWrite 请求将 WAL 缓冲区写入磁盘的平均次数
WAL sync - WAL 文件通过 issue_xlog_fsync 请求同步到磁盘的次数(如果 fsync 开启并且 wal_sync_method 是 fdatasync、fsync 或 fsync_writethrough,否则为零)(wal_sync)
WAL syncs per second - 每秒通过 issue_xlog_fsync 请求将 WAL 文件同步到磁盘的平均次数
WAL write time (s) - 通过 XLogWrite 请求将 WAL 缓冲区写入磁盘所花费的总时间,以秒为单位(如果启用了 track_wal_io_timing,否则为零)。这包括 wal_sync_method 为 open_datasync 或 open_sync 时的同步时间。 (wal_write_time)
WAL write duty - WAL 写入时间占报告持续时间的百分比
WAL sync time (s) - 通过 issue_xlog_fsync 请求将 WAL 文件同步到磁盘所花费的总时间,以秒为单位(如果启用 track_wal_io_timing,fsync 已打开,并且 wal_sync_method 为 fdatasync、fsync 或 fsync_writethrough,否则为零)(wal_sync_time)
WAL sync duty - WAL 同步时间占报告持续时间的百分比

表空间统计

此表包含有关表空间大小和增长的信息:

  • Tablespace - 表空间名称
  • Path - 表空间路径
  • Size - 报告间隔中最后一个样本时的表空间大小
  • Growth - 报告间隔期间的表空间增长

SQL查询统计

此报告部分包含按几个重要统计数据排序的报告间隔期间的顶级语句表。如果数据在采样时可用,则从 pg_stat_statements 视图中捕获数据

按经过时间排列的顶级 SQL - Top SQL by elapsed time

此表包含按已用时间 total_plan_time + pg_stat_statements 视图的 total_exec_time 排序的顶级 pg_profile.topn 语句。从 Postgres 13 开始可用

  • Query ID - 查询标识符作为数据库、用户和查询文本的散列。与 pgcenter 实用程序兼容。以十六进制表示的本机 pg_stat_statements 字段 qieryid 显示在方括号中。
  • Database - 语句数据库名称(来自 dbid 字段)
  • %Total - 此语句的总时间占集群中所有语句的总时间的百分比
    Time (s) - 在此语句中花费的时间(以秒为单位)
    • Elapsed - 在此语句中花费的总时间 (total_plan_time + total_exec_time)
    • Plan - 计划此语句所花费的时间(total_plan_time 字段)
    • Exec - 执行此查询所花费的时间(total_exec_time 字段)
  • I/O time (s):
    • Read - 读取块所花费的时间(blk_read_time 字段)
    • Write - 写入块所花费的时间(blk_write_time 字段)
  • CPU time (s) - 在 CPU 上花费的时间。基于 pg_stat_kcache 扩展提供的数据。
    • Usr - 在用户空间中花费的 CPU 时间
    • Sys - 在内核空间中花费的 CPU 时间
  • Plans - 计划语句的次数(计划字段)
  • Executions - 语句执行的次数(调用字段)

Top SQL by planning time - 按计划时间排列的顶级 SQL

按 pg_stat_statements 视图的 total_plan_time 字段排序的前 pg_profile.topn 语句。从 Postgres 13 开始可用

  • Query ID - 查询标识符作为数据库、用户和查询文本的散列。与 pgcenter 实用程序兼容。以十六进制表示的本机 pg_stat_statements 字段 qieryid 显示在方括号中。
  • Database - 语句数据库名称(来自 dbid 字段)
  • Plan elapsed (s) - 计划此语句所花费的时间(total_plan_time 字段)
  • %Elapsed - 此语句的计划时间占语句已用时间的百分比
  • Plan times (ms) - 此语句的详细计划时间统计(以毫秒为单位)
    • Mean - 计划此语句所花费的平均时间(mean_plan_time 字段)
    • Min - 计划此语句所花费的最短时间(min_plan_time 字段)
    • Max - 计划此语句所花费的最长时间(max_plan_time 字段)
    • StdErr - 计划此语句所用时间的总体标准偏差(stddev_plan_time 字段)
  • Plans - 计划此语句的次数(计划字段)
  • Executions - 此语句执行的次数(调用字段)

Top SQL by execution time - 按执行时间排列的顶级 SQL

按 pg_stat_statements 视图的 total_time(或 total_exec_time)字段排序的前 pg_profile.topn 语句

  • Query ID - 查询标识符作为数据库、用户和查询文本的散列。与 pgcenter 实用程序兼容。以十六进制表示的本机 pg_stat_statements 字段 qieryid 显示在方括号中。
  • Database - 语句数据库名称(来自 dbid 字段)
  • Exec (s) - 执行此语句所花费的时间(total_exec_time 字段)
  • %Elapsed - 执行此语句所花费的时间(total_exec_time 字段)
  • %Total - 此语句的执行时间占集群中所有语句的总运行时间的百分比
  • I/O time (s):
    • Read - 读取块所花费的时间(blk_read_time 字段)
    • Write - 写入块所花费的时间(blk_write_time 字段)
  • Rows - 语句检索或影响的行数(行字段)
  • Execution times (ms) - 该语句的详细执行时间统计(以毫秒为单位)
    • Mean - 执行此语句所花费的平均时间(mean_exec_time 字段)
    • Min - 执行此语句所花费的最短时间(min_exec_time 字段)
    • Max - 执行此语句所花费的最长时间(max_exec_time 字段)
    • StdErr - 执行此语句所用时间的总体标准偏差(stddev_exec_time 字段)
  • Executions - 执行此语句所用时间的总体标准偏差(stddev_exec_time 字段)

Top SQL by executions - 执行次数最多的 SQL

按 pg_stat_statements 视图的调用字段排序的前 pg_profile.topn 语句

  • Query ID - 查询标识符作为数据库、用户和查询文本的散列。与 pgcenter 实用程序兼容。以十六进制表示的本机 - pg_stat_statements 字段 qieryid 显示在方括号中。
  • Database - 语句数据库名称(来自 dbid 字段)
  • Executions - 语句执行计数(调用字段)
  • %Total - 此语句的调用次数占集群中所有语句的总调用次数的百分比
  • Rows - 语句检索或影响的行数(行字段)
  • Mean(ms) - 语句中花费的平均时间,以毫秒为单位(mean_time 或 mean_exec_time 字段)
  • Min(ms) - 语句中花费的最短时间,以毫秒为单位(min_time 或 min_exec_time 字段)
  • Max(ms) - 语句中花费的最长时间,以毫秒为单位(max_time 或 max_exec_time 字段)
  • StdErr(ms) - 语句中所用时间的总体标准偏差,以毫秒为单位(stddev_time 或 stddev_exec_time 字段)
  • Elapsed(s) - 执行此查询所花费的时间,以秒为单位(total_time 或 total_exec_time 字段)

Top SQL by I/O wait time - 按 I/O 等待时间排列的顶级 SQL

按读写时间排序的 pg_profile.topn 语句 (blk_read_time + blk_write_time)

  • Query ID - 查询标识符作为数据库、用户和查询文本的散列。与 pgcenter 实用程序兼容。以十六进制表示的本机 pg_stat_statements 字段 qieryid 显示在方括号中。
  • Database - 语句数据库名称(来自 dbid 字段)
  • IO(s) - 此语句在读取和写入(I/O 时间)上花费的时间量(以秒为单位) (blk_read_time + blk_write_time)
  • R(s) - 此语句读取所花费的时间(以秒为单位) (blk_read_time)
  • W(s) - 此语句写入所花费的时间(以秒为单位) (blk_write_time)
  • %Total - 此语句的 I/O 时间占集群中所有语句的总 I/O 时间的百分比
  • Reads - 此语句读取的块数分为三个子列:
    • Shr - 共享读取(shared_blks_read 字段)
    • Loc - 本地读取(local_blks_read 字段)
    • Tmp - 临时读取(temp_blks_read 字段)
  • Writes - 此语句写入的块数分为三个子列:
    • Shr - 共享写入(shared_blks_written 字段)
    • Loc - 本地写入(local_blks_written 字段)
    • Tmp - 临时写入(temp_blks_written 字段)
  • Elapsed(s) - 执行此查询所花费的时间,以秒为单位(total_time 或 total_exec_time 字段)
  • Executions - 此语句的执行次数(调用字段)

Top SQL by shared blocks fetched - 获取的共享块排名靠前的 SQL

按读取和命中块排序的顶级 pg_profile.topn 语句,有助于检测最多的数据处理语句。

  • Query ID - 查询标识符作为数据库、用户和查询文本的散列。与 pgcenter 实用程序兼容。以十六进制表示的本机 pg_stat_statements 字段 qieryid 显示在方括号中。
  • Database - 语句数据库名称(来自 dbid 字段)
  • blks fetched - 获取的块数(表达式:shared_blks_hit + shared_blks_read)
  • %Total - 为该语句提取的块占为集群中所有语句提取的总块的百分比
  • Hits(%) - 所有块中从缓冲区获得的块的百分比
  • Elapsed(s) - 此语句中花费的时间量,以秒为单位(total_time 或 total_exec_time+total_plan_time 字段)
  • Rows - 语句检索或影响的行数(行字段)
  • Executions - 此语句的执行次数(调用字段)

Top SQL by shared blocks read - 按共享块读取的顶级 SQL

按共享读取排序的顶级 pg_profile.topn 语句,有助于检测大多数读取密集型语句。

  • Query ID - 查询标识符作为数据库、用户和查询文本的散列。与 pgcenter 实用程序兼容。以十六进制表示的本机 pg_stat_statements 字段 qieryid 显示在方括号中。
  • Database - 语句数据库名称(来自 dbid 字段)
  • Reads - 此语句的共享读取块数 (shared_blks_read field)
  • %Total - 此语句的共享读取数占集群中所有语句的总共享读取数的百分比
  • Hits(%) - 所有块中从缓冲区获得的块的百分比
  • Elapsed(s) - 此语句中花费的时间量,以秒为单位(total_time 或 total_exec_time+total_plan_time 字段)
  • Rows - 语句检索或影响的行数(行字段)
  • Executions - 此语句的执行次数(调用字段)

Top SQL by shared blocks dirtied 共享块脏的顶级 SQL

按共享脏缓冲区计数排序的顶级 pg_profile.topn 语句,有助于检测大多数数据更改语句。

  • Query ID - 查询标识符作为数据库、用户和查询文本的散列。与 pgcenter 实用程序兼容。以十六进制表示的本机 pg_stat_statements 字段 qieryid 显示在方括号中。
  • Database - 语句数据库名称(来自 dbid 字段)
  • Dirtied - 此语句弄脏的共享块数(shared_blks_dirtied 字段)
  • %Total - 此语句弄脏的共享块占集群中所有语句弄脏的共享块总数的百分比
  • Hits(%) - 所有块中从缓冲区获得的块的百分比
  • WAL - 语句生成的 WAL 数量(wal_bytes 字段)
  • %Total - 语句生成的 WAL 量占集群中生成的总 WAL 的百分比(pg_current_wal_lsn() 增量)
  • Elapsed(s) - 此语句中花费的时间量,以秒为单位(total_time 或 total_exec_time+total_plan_time 字段)
  • Rows - 语句检索或影响的行数(行字段)
  • Executions - 此语句的执行次数(调用字段)

Top SQL by shared blocks written - 写的共享块排名靠前的 SQL

顶级 pg_profile.topn 语句,它必须执行按写入块计数排序的写入。

  • Query ID - 查询标识符作为数据库、用户和查询文本的散列。与 pgcenter 实用程序兼容。以十六进制表示的本机 pg_stat_statements 字段 qieryid 显示在方括号中。
  • Database - 语句数据库名称(来自 dbid 字段)
  • Written - 此语句写入的块数(shared_blks_written 字段)
  • %Total - 此语句写入的块数占集群中所有语句写入的总块数的百分比
  • %BackendW - 此语句写入的块数占后端写入集群中的所有块的百分比(pg_stat_bgwriter 视图的buffers_backend 字段)
  • Hits(%) - 所有块中从缓冲区获得的块的百分比
  • Elapsed(s) - 此语句中花费的时间量,以秒为单位(total_time 或 total_exec_time+total_plan_time 字段)
  • Rows - 语句检索或影响的行数(行字段)
  • Executions - 此语句的执行次数(调用字段)

Top SQL by WAL size 按 WAL 大小排列的顶级 SQL

排名靠前的 pg_profile.topn 语句,按生成的 WAL 排序(自 pg_stat_statements v1.8 起可用)

  • Query ID - 查询标识符作为数据库、用户和查询文本的散列。与 pgcenter 实用程序兼容。以十六进制表示的本机 pg_stat_statements 字段 qieryid 显示在方括号中。
  • Database - 语句数据库名称(来自 dbid 字段)
  • WAL - 语句生成的 WAL 数量(wal_bytes 字段)
  • %Total - 语句生成的 WAL 量占集群中生成的总 WAL 的百分比(pg_current_wal_lsn() 增量)
  • Dirtied - 此语句弄脏的共享块数(shared_blks_dirtied 字段)
  • WAL FPI - 语句生成的 WAL 整页图像总数(wal_fpi 字段)
  • WAL records - 语句生成的 WAL 字节总数(wal_bytes 字段)

Top SQL by temp usage - 临时使用情况排名靠前的 SQL

按临时 I/O 排序的前 pg_profile.topn 语句,计算为 temp_blks_read、temp_blks_written、local_blks_read 和 local_blks_written 字段的总和

  • Query ID - 查询标识符作为数据库、用户和查询文本的散列。与 pgcenter 实用程序兼容。以十六进制表示的本机 pg_stat_statements 字段 qieryid 显示在方括号中。
  • Database - 语句数据库名称(来自 dbid 字段)
  • Local fetched - 检索到的本地块数(表达式:local_blks_hit + local_blks_read)
  • Hits(%) - 获得的所有本地块中从临时缓冲区获得的本地块的百分比
  • Local (blk) - 临时表中使用的块的 I/O 统计信息
    • Write - 写入的本地块数 (local_blks_written)
    • %Total - 此语句的 local_blks_written 占集群中所有语句的 local_blks_written 总数的百分比
    • Read - 读取本地块的数量 (local_blks_read)
    • %Total - 此语句的 local_blks_read 占集群中所有语句的总 local_blks_read 的百分比
  • Temp (blk) - 操作中使用的块的 I/O 统计信息(如排序和连接)
    • Write - 写入的临时块数 (temp_blks_written)
    • %Total - 此语句的 temp_blks_written 占集群中所有语句的总 temp_blks_written 的百分比
    • Read - 读取本地块的数量 (temp_blks_read)
    • %Total - 此语句的 temp_blks_read 占集群中所有语句的总 temp_blks_read 的百分比
  • Elapsed(s) - 此语句中花费的时间量,以秒为单位(total_time 或 total_exec_time+total_plan_time 字段)
  • Rows - 语句检索或影响的行数(行字段)
  • Executions - 此语句的执行次数(调用字段)

rusage statistics - 使用统计

此部分包含 pg_stat_kcache 扩展提供的资源使用统计信息(如果它在报告间隔期间可用)。

Top SQL by system and user time - 按系统和用户时间排列的顶级 SQL

按 pg_stat_kcache 的 user_time 和 system_time 字段之和排序的前 pg_profile.topn 语句。

  • Query ID - 查询标识符作为数据库、用户和查询文本的散列。与 pgcenter 实用程序兼容。以十六进制表示的本机 pg_stat_statements 字段 qieryid 显示在方括号中。
  • Database - 语句数据库名称(来自 dbid 字段)
  • User Time - User CPU time used
    • Plan (s) - 计划期间经过的用户 CPU 时间(以秒为单位)(plan_user_time 字段)
    • Exec (s) - 执行期间经过的用户 CPU 时间(以秒为单位)(exec_user_time 或 user_time 字段)
    • %Total - 此语句的用户 CPU 时间占所有语句的汇总用户 CPU 时间的百分比
  • System Time - System CPU time used
    • Plan (s) - 计划期间经过的系统 CPU 时间(以秒为单位)(plan_system_time 字段)
    • Exec (s) - 执行期间经过的系统 CPU 时间(以秒为单位)(exec_system_time 或 system_time 字段)
    • %Total - 此语句的系统 CPU 时间占所有语句的汇总系统 CPU 时间的百分比

Top SQL by reads/writes done by filesystem layer - 由文件系统层完成的读取/写入的顶级 SQL

按字段总和排序的前 pg_profile.topn 语句读取和写入 pg_stat_kcache 的字段。

  • Query ID - 查询标识符作为数据库、用户和查询文本的散列。与 pgcenter 实用程序兼容。以十六进制表示的本机 pg_stat_statements 字段 qieryid 显示在方括号中。
  • Database - 语句数据库名称(来自 dbid 字段)
  • Read Bytes - 文件系统层读取的字节数
    • Plan - 计划期间读取的字节数(plan_reads 字段)
    • Exec - 执行期间读取的字节数(exec_reads 字段)
    • %Total - 此语句的读取字节数占所有语句的摘要读取字节数的百分比
  • Writes - 文件系统层写入的字节数(写入字段)
    • Plan - 计划期间写入的字节数(plan_writes 字段)
    • Exec - 执行期间写入的字节数(exec_writes 字段)
    • %Total - 此语句的写入字节数占所有语句的汇总写入字节数的百分比

Complete list of SQL texts - SQL 文本的完整列表

查询报告中提及的所有语句的文本。您可以使用任何统计表中的查询 ID 链接到达那里并查看查询文本。本节中的查询仅限于 pg_profile.max_query_length(默认 20000)个字符,但可以从扩展表中获取完整的查询文本。

Schema object statistics - 模式对象统计

这部分报告包含顶级数据库对象,使用来自统计收集器视图的统计信息。

按估计的顺序扫描量排名靠前的表 - Top tables by estimated sequentially scanned volume

按估计量排序的顶级数据库表,按顺序扫描读取。基于 pg_stat_all_tables 视图。在这里您可以搜索表,可能缺少一些索引。当没有使用 pg_relation_size() 收集到的关系大小时,将根据 pg_class.relpages 字段计算估计值。这将不太准确,因此这些值将在方括号中提供。

  • DB - 表的数据库名称
  • Tablespace - 表空间名称,表所在的位置
  • Schema - 表的模式名称
  • Table - 表名
  • ~SeqBytes - 估计的体积,通过顺序扫描读取。计算为报表所有样本的关系大小乘以 seq_scan 的总和。
  • SeqScan - 对表执行的顺序扫描数(seq_scan 字段)
  • IxScan - 在此表上启动的索引扫描数(idx_scan 字段)
  • IxFet - 索引扫描获取的活动行数(idx_tup_fetch 字段)
  • Ins - 插入的行数(n_tup_ins 字段)
  • Upd - 更新的行数(包括 HOT)(n_tup_upd 字段)
  • Del - 删除的行数(n_tup_del 字段)
  • Upd(HOT) - HOT 更新的行数(n_tup_hot_upd 字段)

Top tables by blocks fetched

获取的块是从磁盘(读取)或共享缓冲区(命中)处理的块。此列表中的表按表关系、其索引、表的 TOAST(如果存在)和 TOAST 索引(如果存在)的获取块的总和进行排序。本节可以将您的注意力集中在具有过多块处理的表上。基于 pg_statio_all_tables 视图的数据。

  • DB - 表的数据库名称

  • Tablespace - 表空间名称,表所在的位置

  • Schema - 表的模式名称

  • Table - 表名

  • Heap - 获取的关系块的统计信息 (heap_blks_read + heap_blks_hit)

  • Ix - 获取的所有关系索引块的统计信息 (idx_blks_read + idx_blks_hit)

  • TOAST - 获取的 TOAST 表块的统计信息 (toast_blks_read + toast_blks_hit)

  • TOAST-Ix - 获取的 TOAST 索引块的统计信息 (tidx_blks_read + tidx_blks_hit)
    此表中的每个统计字段分为两列:

  • Blks - 为关系堆、索引、TOAST 或 TOAST 索引提取的块数

  • %Total - 为关系堆、索引、TOAST 或 TOAST 索引获取的块占整个集群中获取的所有块的百分比

Top tables by blocks read

按块读取排序的顶级表。此列表中的表按表、其索引、表的 TOAST(如果存在)和 TOAST 索引(如果存在)的块读取总和排序。本节可以将您的注意力集中在具有过多块阅读的表格上。基于 pg_statio_all_tables 视图的数据。

  • DB - 表的数据库名称

  • Tablespace - 表空间名称,表所在的位置

  • Schema - 表的模式名称

  • Table - 表名

  • Heap - 关系块读取的统计信息 (heap_blks_read)

  • Ix - 关系块读取的统计信息 (heap_blks_read)

  • TOAST - TOAST 表块读取的统计信息 (toast_blks_read)

  • TOAST-Ix - TOAST 索引块读取的统计信息 (tidx_blks_read)

  • Hit(%) - 从共享缓冲区获取的堆、索引、toast 和 toast 索引块的数量占从共享缓冲区和文件系统获取的所有块的百分比
    从共享缓冲区获取的堆、索引、toast 和 toast 索引块的数量占从共享缓冲区和文件系统获取的所有块的百分比

  • Blks - 关系堆、索引、TOAST 或 TOAST 索引的块读取次数

  • %Total - 关系堆、索引、TOAST 或 TOAST 索引的块读取次数

Top DML tables

按受 DML 影响的行数排序的顶级表,即 n_tup_ins、n_tup_upd 和 n_tup_del 的总和(包括 TOAST 表)。

  • DB - 表的数据库名称
  • Tablespace - 表空间名称,表所在的位置
  • Schema - 表的模式名称
  • Table - 表名
  • Ins - 插入的行数(n_tup_ins 字段)
  • Upd - 更新的行数(包括 HOT)(n_tup_upd 字段)
  • Del - 删除的行数(n_tup_del 字段)
  • Upd(HOT) - HOT 更新的行数(n_tup_hot_upd 字段)
  • SeqScan - 对表执行的顺序扫描数(seq_scan 字段)
  • SeqFet - 顺序扫描获取的活动行数(seq_tup_read 字段)
  • IxScan - 在此表上启动的索引扫描数(idx_scan 字段)
  • IxFet - 在此表上启动的索引扫描数(idx_scan 字段)

Top tables by updated/deleted tuples

按操作量排序的顶级表,导致自动清理负载,即 n_tup_upd 和 n_tup_del 的总和(包括 TOAST 表)。根据提供的真空度考虑微调真空度相关参数并分析运行统计数据。

  • DB - 表的数据库名称
  • Tablespace - 表空间名称,表所在的位置
  • Schema - 表的模式名称
  • Table - 表名
  • Upd - 更新的行数(包括 HOT)(n_tup_upd 字段)
  • Upd(HOT) - HOT 更新的行数(n_tup_hot_upd 字段)
  • Del - 删除的行数(n_tup_del 字段)
  • Vacuum - 此表被手动清理的次数(不包括 VACUUM FULL)(vacuum_count 字段)
  • AutoVacuum - 此表被手动清理的次数(不包括 VACUUM FULL)(vacuum_count 字段)
  • Analyze - 手动分析此表的次数(analyze_count 字段)
  • AutoAnalyze - 此表已被 autovacuum 守护程序分析的次数(autoanalyze_count 字段)

Top growing tables

按增长排序的顶级表格。当没有使用 pg_relation_size() 收集到的关系大小时,将根据 pg_class.relpages 字段计算表增长。这将不太准确,因此这些值将在方括号中提供。

  • DB - 表的数据库名称
  • Tablespace - 表空间名称,表所在的位置
  • Schema - 表的模式名称
  • Table - 表名
  • Size - 表大小,因为它是在报告间隔中的最后一个样本的时刻
  • Growth - table growth
  • Ins - 插入的行数(n_tup_ins 字段)
  • Upd - 更新的行数(包括 HOT)(n_tup_upd 字段)
  • Del - 删除的行数(n_tup_del 字段)
  • Upd(HOT) - HOT 更新的行数(n_tup_hot_upd 字段)

Top indexes by blocks fetched

获取的块是从磁盘(读取)或共享缓冲区(命中)处理的块。基于 pg_statio_all_indexes 视图的数据。

  • DB - 索引的数据库名称
  • Tablespace - 表空间名称,索引所在的位置
  • Schema - 索引的架构名称
  • Table - 表名
  • Index - 索引名称
  • Scans - 对索引(idx_scan 字段)执行的扫描次数
  • Blks - 从此索引获取的块 (idx_blks_read + idx_blks_hit)
  • %Total - 为该索引获取的块占整个集群中获取的所有块的百分比

Top indexes by blocks read

按块读取排序的顶级索引。基于 pg_statio_all_indexes 视图的数据。

  • DB - 索引的数据库名称
  • Tablespace - 表空间名称,索引所在的位置
  • Schema - 索引的schema名称
  • Table - 表名
  • Index - 索引名称
  • Scans - 对索引(idx_scan 字段)执行的扫描次数
  • Blk Reads - 从此索引读取的磁盘块数 (idx_blks_read)
  • %Total - 来自该索引的块读取占整个集群中所有块读取的百分比
  • Hits(%) - 来自该索引的块读取占整个集群中所有块读取的百分比

Top growing indexes

按增长排序的顶级指数。当没有使用 pg_relation_size() 收集到的关系大小时,将根据 pg_class.relpages 字段计算估计值。这将不太准确,因此这些值将在方括号中提供。

  • DB - 索引的数据库名称
  • Tablespace - 表空间名称,索引所在的位置
  • Schema - 索引的schema名称
  • Table - 表名
  • Index - 索引名称
  • Index - index statistics
    • Size - 索引大小,因为它是在报告间隔中的最后一个样本的时刻
    • Growth - 报告间隔期间的指数增长
  • Table - 基础表统计信息
    • Ins - 插入基础表的行数(n_tup_ins 字段)
    • Upd - 基础表中更新的行数(没有 HOT)(n_tup_upd - n_tup_hot_upd)
    • Del - 从基础表中删除的行数(n_tup_del 字段)

Unused indexes

报告间隔期间的非扫描索引按底层表的 DML 操作排序,导致索引支持。约束索引被排除在外。

  • DB - 索引的数据库名称
  • Tablespace - 表空间名称,索引所在的位置
  • Schema - 索引的schema名称
  • Table - 表名
  • Index - 索引名称
  • Index - index statistics
    • Size - 索引大小,因为它是在报告间隔中的最后一个样本的时刻
    • Growth - 报告间隔期间的指数增长
  • Table - 基础表统计信息
    • Ins - 插入基础表的行数(n_tup_ins 字段)
    • Upd - 基础表中更新的行数(没有 HOT)(n_tup_upd - n_tup_hot_upd)
    • Del - 从基础表中删除的行数(n_tup_del 字段)

User function statistics

此报告部分包含集群中的顶级函数,基于 pg_stat_user_functions 视图。

总时间排名靠前的函数

按经过时间排序的顶级函数。

  • DB - 函数的数据库名称
  • Schema - 索引的schema名称
  • Function - 函数名
  • Executions - 此函数被调用的次数(调用字段)
  • Time (s) - 以秒为单位的功能计时统计
    • Total - 在这个函数和它调用的所有其他函数中花费的总时间(total_time 字段)
    • Self - 在这个函数本身上花费的总时间,不包括它调用的其他函数(self_time 字段)
    • Mean - 单个函数执行的平均时间
    • Mean self - 单个函数执行的平均自身时间

执行次数最多的函数

按执行次数排序的顶级函数。

  • DB - 函数的数据库名称
  • Schema - 索引的schema名称
  • Function - 函数名
  • Executions - 此函数被调用的次数(调用字段)
  • Time (s) - 以秒为单位的功能计时统计
    • Total - 在这个函数和它调用的所有其他函数中花费的总时间(total_time 字段)
    • Self - 在这个函数本身上花费的总时间,不包括它调用的其他函数(self_time 字段)
    • Mean - 单个函数执行的平均时间
    • Mean self - 单个函数执行的平均自身时间

Top trigger functions by total time - 按总时间排列的顶级触发函数

Top trigger functions sorted by time elapsed.

  • DB - 函数的数据库名称
  • Schema - 索引的schema名称
  • Function - 函数名
  • Executions - 此函数被调用的次数(调用字段)
  • Time (s) - 以秒为单位的功能计时统计
    • Total - 在这个函数和它调用的所有其他函数中花费的总时间(total_time 字段)
    • Self - 在这个函数本身上花费的总时间,不包括它调用的其他函数(self_time 字段)
    • Mean - 单个函数执行的平均时间
    • Mean self - 单个函数执行的平均自身时间

Vacuum-related stats

Top tables by vacuum operations

按vacuums (手动和自动)处理的顶级表

  • DB - 表的数据库名称
  • Tablespace - 表空间名称,表所在的位置
  • Schema - 表的模式名称
  • Table - 表名
  • Vacuum count - 此表被手动清理的次数(不包括 VACUUM FULL)(vacuum_count 字段)
  • Autovacuum count - 此表被 autovacuum 守护进程清理的次数(autovacuum_count 字段)
  • Ins - 插入的行数(n_tup_ins 字段)
  • Upd - 更新的行数(包括 HOT)(n_tup_upd 字段)
  • Del - 删除的行数(n_tup_del 字段)
  • Upd(HOT) - HOT 更新的行数(n_tup_hot_upd 字段)

Top tables by analyze operations - 分析操作排名靠前的表

按分析运行(手动和自动)计数排序的前几表

  • DB - 表的数据库名称
  • Tablespace - 表空间名称,表所在的位置
  • Schema - 表的模式名称
  • Table - 表名
  • Analyze count - 手动分析此表的次数(analyze_count 字段)
  • Autoanalyze count - 此表已被 autovacuum 守护程序分析的次数(autoanalyze_count 字段)
  • Ins - 插入的行数(n_tup_ins 字段)
  • Upd - 更新的行数(包括 HOT)(n_tup_upd 字段)
  • Del - 删除的行数(n_tup_del 字段)
  • Upd(HOT) - HOT 更新的行数(n_tup_hot_upd 字段)

Top indexes by estimated vacuum load 估计vacuum负荷的顶级指标

此表提供由表索引引起的隐式vacuum负载的估计。这是按在基础表上执行的真空计数乘以索引大小排序的顶级索引。当没有使用 pg_relation_size() 收集到的关系大小时,将根据 pg_class.relpages 字段计算估计值。这将不太准确,因此这些值将在方括号中提供。

  • DB - 索引的数据库名称
  • Tablespace - 表空间名称,索引所在的位置
  • Schema - 索引的schema名称
  • Table - 表名
  • Index - 索引名称
  • ~Vacuum bytes - vacuum负载估计计算为 (vacuum_count + autovacuum_count) * index_size
  • Vacuum cnt - 此表被手动清理的次数(不包括 VACUUM FULL)(vacuum_count 字段)
  • Autovacuum cnt - 此表被 autovacuum 守护进程清理的次数(autovacuum_count 字段)
  • IX size - 报告间隔期间的平均索引大小
  • Relsize - 报告间隔期间的平均关系大小

Top tables by dead tuples ratio 死元组比率排名靠前的表

本节包含上次vacuum运行的修改表。统计数据对报告间隔内的最后一个样本有效。基于 pg_stat_all_tables 视图。当 pg_relation_size() 没有收集到关系大小时,将从 pg_class.relpages 字段中提供大小。这将不太准确,因此这些值将在方括号中提供。

Top tables, sized 5 MB and more, sorted by dead tuples ratio.顶级表,大小为 5 MB 及以上,按死元组比率排序。

  • DB - 表的数据库名称
  • Schema - 表的模式名称
  • Table - 表名
  • Live - 估计的活动行数 (n_live_tup)
  • Dead - 估计的死行数 (n_dead_tup)
  • %Dead - 表中的死行占表中所有行的百分比
  • Last AV - 上次该表被 autovacuum 守护进程 (last_autovacuum) 清空的时间
  • Size - 表格大小,与上次报告样本时的大小相同。

Top tables by modified tuples ratio - 按修改后的元组比率排名靠前的表

本节包含上次真空运行的修改表。统计数据对报告间隔内的最后一个样本有效。基于 pg_stat_all_tables 视图。当 pg_relation_size() 没有收集到关系大小时,将从 pg_class.relpages 字段中提供大小。这将不太准确,因此这些值将在方括号中提供。

排名靠前的表,大小为 5 MB 及以上,按修改后的元组比率排序。

  • DB - 表的数据库名称
  • Schema - 表的模式名称
  • Table - 表名
  • Live - 估计的活动行数 (n_live_tup)
  • Dead - 估计的死行数 (n_dead_tup)
  • Mod - 估计自上次分析此表以来修改的行数 (n_mod_since_analyze)
  • %Mod - 表中修改的行占表中所有行的百分比
  • Last AA - 上次 autovacuum 守护进程分析此表的时间
  • Size - 表格大小,与上次报告样本时的大小相同。

报告间隔期间的集群设置

报告的这一部分包含 PostgreSQL GUC 参数,以及报告间隔期间函数 version()、pg_postmaster_start_time()、pg_conf_load_time() 和字段 system_identifier 的 pg_control_system() 函数的值。

  • Setting - name of a parameter
  • reset_val - pg_settings 视图的 reset_val 字段。粗体字体用于显示设置,在报告间隔期间更改。
  • Unit - 设定单位
  • Source - 定义此设置的配置文件,分号后的行号。
  • Notes - 当在报告间隔内第一次观察到该值时,该字段将包含样本的时间戳。

What you need to remember… - 你需要记住的…

PostgreSQL 在执行完成后收集执行统计信息。如果一个语句的单次执行持续了多个样本,它将仅影响最后一个样本的统计信息(当它完成时)。而且您无法获得仍在运行的语句的统计信息。此外,vacuum和检查点等维护过程将仅在完成时更新统计信息。
重置任何 PostgreSQL 统计信息可能会影响下一个样本的准确性。
关系上的排他锁与计算关系大小冲突。 Sample 不会收集任何会话持有的与 AccessExclusiveLock 的关系大小。但是,会话可以在样本处理期间获取关系上的 AccessExclusiveLock。为了解决这个问题,lock_timeout 设置为 3 秒,因此如果 take_sample() 函数在 3 秒内无法获取锁,它将失败,并且不会生成样本。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论