如何对plpgsql过程进行分析

7

我正在尝试提高一个长时间运行的plpgsql存储过程的性能,但我不知道是否有任何可用的分析工具。请问有人可以提供关于如何进行此类过程分析的建议吗?

5个回答

5

从包括 clock_timestamp() 的过程中提取一些notices,以查看数据库花费时间的位置。并尽可能简化过程。

你能给我们展示一个例子吗?


我原本希望有一种不需要更改过程的方法,但这可能比没有好。http://www.depesz.com/index.php/2010/03/18/profiling-stored-proceduresfunctions/ 记录了类似的过程,但似乎过于复杂以获取可用数据。如果有帮助的话,该过程是一组嵌套循环,用于为Solr数据导入处理程序查询创建文档(可能没有)。 - Aneurysm9
这不是一个很好的方法,但这是唯一的方法。这也是为什么保持简短和简单很重要的原因:短小的程序更容易调试和分析,就像其他代码一样。 - Frank Heikens
不幸的是,该过程非常简单。它通过选择一些数据,迭代n,选择更多数据,迭代嵌套的1:n关系,然后从内部循环中返回下一个完整行。所有比SELECT或FOR更复杂的内容都已经放在其他过程中了。 - Aneurysm9

2

1

首先,您可以在Postgres日志文件中打开所有语句的记录。日志将包含每个语句的运行时间。这样,您就可以识别最慢的查询并尝试优化它们。

但是根据您对Frank帖子的评论,我猜循环可能是您的问题所在。尝试摆脱循环,并在单个查询中完成所有操作。一条读取大量行的语句通常比许多仅读取少量行的语句更有效率。


1

0

使用的工具是https://github.com/bigsql/plprofiler

如果您使用PGDG yum存储库安装了PostgreSQL,则安装plprofiler非常简单,只需运行下面的命令,但请记住它仅适用于PostgreSQL 11及更高版本(将XX替换为您的版本号):

yum install plprofiler_XX-server plprofiler_XX-client plprofiler_XX

然后将分析器扩展添加到您的数据库中:

CREATE EXTENSION plprofiler;

然后要在 plpgsql 函数上生成一个配置文件报告,运行如下命令:

plprofiler run -U your_username -d your_database --command "SELECT * FROM your_custom_plpgsql_function()" --output profile.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接