如何在Postgresql中分析聚合?

时间:2015-03-03 22:00:22

标签: postgresql

我创建了一个SQL函数并将它放在GROUP BY,HAVING子句中,但我发现agg函数花费了太多时间。查询计划在这里

http://explain.depesz.com/s/ooaM

功能不应该这么慢,我想理解为什么需要这么长时间。有谁能建议我可以用来配置postgresql的一些工具?我正在研究pg9.4,当我正在研究它的源代码时,我想了解它的内部。谢谢。

1 个答案:

答案 0 :(得分:0)

如果您想在postgres上执行详细的机器指令级别检测,可以使用valgrind

具体来说,您可以使用以下命令。

valgrind --tool=callgrind --dump-instr=yes --trace-jump=yes ./postgres -D your_data_dir

请注意,此类工具要求使用-g编译postgres,即在configure命令中,您需要执行configure --enable-debug

然后您可以定期启动客户端会话:psql database_name。 然后键入要执行的查询。 (请注意,在涉及聚合的CPU密集型查询中,配置文件可能会导致显着减慢。因此,您可能需要将一小部分数据样本用于配置文件。)

执行完成后,valgrind将生成多个输出文件,即callgrind.$pid.out,其中$pid是所有postgres进程的进程ID,包括后端和负责处理运行查询的客户端会话的人。假设该进程的pid为12345,接下来需要做的是将原始配置文件输出文件转换为人类可读的表示形式。您将使用以下命令。

callgrind_annotate --auto=yes callgrind.12345.out > profie.txt