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

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

【问题讨论】:

    标签: postgresql stored-procedures profiling 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过程中的子语句)的调用号和总调用时间。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-18
          • 2011-05-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多