如何分析 plpgsql 过程

Posted

技术标签:

【中文标题】如何分析 plpgsql 过程【英文标题】:How to profile plpgsql procedures 【发布时间】:2011-02-08 16:33:55 【问题描述】:

我正在尝试提高长时间运行的 plpgsql 存储过程的性能,但我不知道有哪些可用的分析工具(如果有的话)。任何人都可以就如何分析这样的过程提供建议吗?

【问题讨论】:

【参考方案1】:

从包括clock_timestamp() 在内的过程中引发一些notices 以查看数据库花费时间的位置。并使程序尽可能简单。

你能给我们举个例子吗?

【讨论】:

我希望有一种不需要更改程序的方法,但这可能总比没有好。 depesz.com/index.php/2010/03/18/… 记录了类似的过程,但获取可用数据似乎过于复杂。该过程是一组嵌套循环,用于为 Solr 数据导入处理程序查询创建文档,如果有帮助(可能没有)。 这不是一个很好的方法,但它是唯一的方法。这也是让事情保持简短和简单很重要的原因:简短的过程更容易调试和分析,就像其他代码一样。 不幸的是,这个过程是尽可能简单的。它通过选择一些数据、迭代 n、选择更多数据、迭代嵌套的 1:n 关系来遍历一堆 1:n 关系,然后在整行准备好后从内部循环返回 NEXT。比 SELECT 或 FOR 更复杂的所有内容都已放入其他过程中。【参考方案2】:

我们目前正在寻找这个问题的更好答案,并且偶然发现了这个工具: http://www.openscg.com/2015/02/postgresql-plpgsql-profiler/ 主办地点: https://bitbucket.org/openscg/plprofiler

它声称可以为您提供所需的内容,包括在函数的每一行上花费的总时间。我们还没有进一步调查,但根据作者的说法,我们是乐观的。

【讨论】:

【参考方案3】:

首先,您可以在 Postgres 日志文件中打开 logging of all statements。日志将包含每个语句的运行时。通过这种方式,您可以识别最慢的查询并尝试优化它们。

但是阅读您对弗兰克帖子的评论,我猜想循环是您的问题。尝试摆脱循环并在单个查询中完成所有操作。一条读取大量行的语句通常比读取几行的大量语句更有效。

【讨论】:

【参考方案4】:

尝试使用 pg_stat_statements 扩展(http://www.postgresql.org/docs/9.2/static/pgstatstatements.html)。 它可以显示所有语句(包括plpgsql过程中的子语句)的调用号和总调用时间。

【讨论】:

以上是关于如何分析 plpgsql 过程的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PostgreSQL 9.2 中分析 plpgsql 函数

如何在不创建函数的情况下运行 plpgsql?

在屏幕套接字中显示 plpgsql 过程的执行时间

sql plpgsql存储过程中的动态查询示例

如何在plpgsql中读写psql变量

如何使用 plpgsql 插入一行并返回 *