二月 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:在此函数本身花费的时间(单位:毫秒),计算的时间不包括它调用的其他函数。