PostgreSQL 教程: 检查慢函数

二月 23, 2024

摘要:在本教程中,您将学习如何在 PostgreSQL 中检查慢函数。

介绍

仅使用关系型数据库来存储数据,限制了数据库系统的全部潜力,它们是为服务端处理而设计的,除了作为数据容器之外,还提供了其他能力。其中一些能力是存储过程和函数,允许用户编写服务端代码,利用将计算能力引入数据的原则,避免大型数据集往返的网络开销,和充分利用服务器资源。PostgreSQL 从一开始就允许使用用户自定义函数(UDF),在数据库内进行编程。这些函数可以用多种语言编写,如 SQL、PL/pgSQL、PL/Python、PL/Perl 等。但最常见的是提到的前两种:SQL 和 PL/pgSQL。

从 PostgreSQL 8.4 开始,PostgreSQL 提供了一个有价值的特性:针对每个函数的统计信息。在此特性支持以前,没有一种简单的方法可以找出数据库中最耗时的函数。

对于单次调用所花费的时间,可以通过手动执行函数很容易得到,但太麻烦了,在某些情况下,无法在给定时间段内找出函数花费的总时间。通过启用全量日志记录,读取大量日志文件来聚合每次调用的持续时间,是获取该统计信息的唯一方法。现在,您可以通过查询一个简单视图pg_stat_user_functions,来找到此详细信息了!

要启用函数跟踪,您需要在postgresql.conf中开启 “track_functions” 参数。默认值为none,用于禁用函数统计信息的跟踪。指定pl仅跟踪过程语言函数,指定all还会跟踪 SQL 和 C 语言函数。

找出慢函数

PostgreSQL 允许用户跟踪数据库中函数的性能。例如,只要您配置好 track_functions 参数,允许跟踪函数调用次数和花费的时间,我们就可以使用视图 pg_stat_user_functions,来查看性能统计信息。

例如,若要使用此视图,可以编写如下查询:

SELECT schemaname || '.' || funcname AS func_name, calls, total_time,
       round((total_time/calls)::numeric, 2) AS mean_time, self_time
FROM pg_catalog.pg_stat_user_functions
ORDER BY self_time DESC;

这会输出以下内容:

         func_name         | calls | total_time | mean_time | self_time
---------------------------+-------+------------+-----------+-----------
 public.auditoria_clientes |  2684 |    593.705 |      0.22 |   593.705
 public.registro_ddl_drop  |     2 |    422.386 |    211.19 |   422.386
 public.f_plpgsql          |     2 |     93.908 |     46.95 |    93.908
 public.registro_ddl       |    17 |     39.217 |      2.31 |    39.217
 public.max_pro_min        |     3 |      1.589 |      0.53 |     1.589
 public.prc_clientes       |     2 |      1.447 |      0.72 |     0.387

calls:此函数被调用的次数。

total_time:调用此函数花费的时间(单位:毫秒),计算的时间也包括了该函数代码中调用的其他函数。

mean_time:调用此函数花费的平均时间(单位:毫秒),计算的时间也包括了该函数代码中调用的其他函数。

self_time:在此函数本身花费的时间(单位:毫秒),计算的时间不包括它调用的其他函数。

了解更多

PostgreSQL 监控