我有一个小型Python项目(约5000行),使用pg库在中型Postgres数据库表(约5000万个条目)上运行某些繁重的统计计算。
统计计算的本质意味着代码需要一段时间才能运行,我想要分析代码的Python和PSQL。我尝试了我的首选Python分析器(cProfile),但它似乎对PSQL方面视而不见。
如何在我的系统中分析Python和PSQL?
答案 0 :(得分:3)
我刚刚阅读 cProfile doc。
它测量CPU时间,不计入I / O或进程外时间。我假设您的SQL查询由I / O或进程外时间控制,因此您自然不会看到它们。 (您可以通过提供自己的计时器功能来衡量挂钟时间。)
它在 cumtime 列中按功能报告包含时间,但不按代码行报告,因此您无法获得有关各行费用的时间百分比的任何信息。 如果它按行代码报告挂钟时间百分比,那么您可以看到哪些查询的成本最高。
Here's the technique很多人都在使用。 它不担心计时的准确性。 如果特定查询约占您等待时间的50%或60%,您真的关心它的百分比是多少吗?
事实上,当你在 两个样本 上看到它时,你知道它是一个很大的,你知道它究竟是什么。
答案 1 :(得分:2)
基本上,你不能。
你可以衡量PostgreSQL查询中的性能和执行计划,但我甚至无法想象你如何将它与命令式编程语言的配置文件集成。你可以用生成相同查询的Perl完全替换Python,并且它无论如何也不会对PostgreSQL产生一点点差别。
所以 - 有两个有趣的问题需要回答。首先,哪些查询占用了你所有的时间?其次,查询规划器是否做得很好?
首先,有许多日志文件处理器可以为您构建统计信息,但我建议使用pg_stat_statements扩展名。保持运行状态,它将计算运行不同查询的次数以及它们需要多长时间。
对于第二个,您要检查通过EXPLAIN生成的查询计划,看看是否需要更改可用的索引,或者查询本身。这里的主题太大了,但wiki是一个很好的起点。有一个很好的online tool来帮助说明查询计划。