查询时间统计(PostgreSQL)

Don*_*ner 7 sql postgresql performance

我有一个十亿行的表格,我想确定表格的几个查询的平均时间和标准时间偏差:

select * from mytable where col1 = '36e2ae77-43fa-4efa-aece-cd7b8b669043';
select * from mytable where col1 = '4b58c002-bea4-42c9-8f31-06a499cabc51';
select * from mytable where col1 = 'b97242ae-9f6c-4f36-ad12-baee9afae194';

....
Run Code Online (Sandbox Code Playgroud)

我有一千个col1存储在另一个表中的随机值.

有没有办法在一个单独的表中存储每个查询花费的时间(以毫秒为单位),以便我可以对它们运行一些统计信息?类似于:对于随机表中的每个col1,执行查询,记录时间,然后将其存储在另一个表中.

一个完全不同的方法就可以了,只要我可以留在PostgreSQL中(即,我不想编写外部程序来执行此操作).

Pab*_*ruz 12

您需要更改PostgreSQL配置文件.

请启用此属性:

log_min_duration_statement = -1        # -1 is disabled, 0 logs all statements                                    
                                       # and their durations, > 0 logs only                                       
                                       # statements running at least this number                                  
                                       # of milliseconds             
Run Code Online (Sandbox Code Playgroud)

之后,将记录执行时间,您将能够确切地知道执行查询的糟糕程度(或良好程度).

您还可以使用一些LOG PARSING实用程序来提供令人敬畏的HTML输出,以便进一步分析,例如pgfouine.


mat*_*t b 6

你知道这个EXPLAIN陈述吗?

此命令显示PostgreSQL计划程序为提供的语句生成的执行计划.执行计划显示如何扫描语句引用的表 - 通过简单顺序扫描,索引扫描等 - 如果引用了多个表,将使用哪些连接算法将每个表所需的行汇集在一起输入表.

显示的最关键部分是估计的语句执行成本,这是计划者猜测运行语句需要多长时间(以磁盘页面提取为单位测量).实际上显示了两个数字:可以返回第一行之前的启动时间,以及返回所有行的总时间.对于大多数查询,总时间是重要的,但在诸如EXISTS中的子查询之类的上下文中,规划器将选择最小的启动时间而不是最小的总时间(因为执行器将在获得一行后停止).此外,如果使用LIMIT子句限制要返回的行数,计划程序会在端点成本之间进行适当的插值,以估计哪个计划确实最便宜.

ANALYZE选项导致语句实际执行,而不仅仅是计划.在每个计划节点内花费的总耗用时间(以毫秒为单位)和实际返回的总行数将添加到显示中.这对于了解规划师的估计是否接近现实非常有用.

可以很容易地编写一个脚本,EXPLAIN ANALYZE对您的查询执行表中的每个随机值,并将输出保存到文件/表/等.