是否有可能获得postgres中的查询历史记录

问题描述 投票:51回答:5

是否有可能获得postgres中的查询历史记录?是否有可能获得每个查询所花费的时间?我目前正在尝试在我正在处理的应用程序中识别慢查询。

我正在使用Postgres 8.3.5

database performance postgresql timing
5个回答
64
投票

数据库本身没有历史记录,如果您使用psql,可以使用“\ s”查看命令历史记录。

通过在postgresql.conf文件中设置log_statement,可以将日后查询或其他类型的操作放入日志文件中。您可能需要的是log_min_duration_statement,如果将其设置为0,则会将所有查询及其持续时间记录在日志中。一旦您的应用程序上线,这可能会有所帮助,如果您将其设置为更高的值,您将只看到有助于优化的长时间运行的查询(您可以对找到的查询运行EXPLAIN ANALYZE以找出它们的原因'慢)。

在这方面要知道的另一个方便的事情是,如果你运行psql并告诉它“\ timing”,它将显示在此之后每个语句需要多长时间。所以如果你有一个如下所示的sql文件:

\timing
select 1;

您可以使用正确的标志运行它,并查看每个语句与所花费的时间交错。以下是结果的样子和结果:

$ psql -ef test.sql 
Timing is on.
select 1;
 ?column? 
----------
        1
(1 row)

Time: 1.196 ms

这很方便,因为您不需要成为数据库超级用户来使用它,这与更改配置文件不同,如果您正在开发新代码并想要测试它,则更容易使用。


3
投票

如果要识别慢查询,则方法是使用log_min_duration_statement设置(在postgresql.conf中或使用ALTER DATABASE SET设置每个数据库)。

当你记录数据时,你可以使用grep或一些专门的工具 - 比如pgFouine或我自己的analyzer--缺乏适当的文档,但尽管如此 - 运行得很好。


0
投票

pgBadger是另一种选择 - 也列在这里:https://github.com/dhamaniasad/awesome-postgres#utilities

虽然需要一些额外的设置来捕获postgres日志中的必要数据,请参阅官方网站。


-2
投票

对于那些使用UI Navicat的人来说:

您必须设置您的首选项以利用where文件来存储历史记录。

如果这是空白,您的Navicat将为空白。

enter image description here

PS:我与Navicat或其附属公司没有任何关联关系。只是想帮忙。

© www.soinside.com 2019 - 2024. All rights reserved.