75

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

我正在使用 Postgres 8.3.5

4

8 回答 8

80

数据库本身没有历史记录,如果您使用 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

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

于 2009-10-06T04:37:04.310 回答
4

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

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

于 2009-10-06T06:35:50.343 回答
4

你可以使用喜欢

\s 

它将获取终端的所有命令历史记录,以将其导出到文件中

\s filename
于 2020-08-18T12:06:03.133 回答
1

仅供使用UI Navicat的用户参考:

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

如果这是空白,你的 Navicat 将是空白的。

在此处输入图像描述

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

于 2017-05-09T23:45:58.083 回答
1

如果问题是查看在命令行中执行的查询的历史记录。答案是

按照Postgresql 9.3,在你的命令行中尝试\?,你会在搜索历史中找到所有可能的命令,

  \s [FILE]              display history or save it to file

在您的命令行中,尝试\s. 这将列出您在当前会话中执行的查询历史记录。也可以保存到文件中,如下图。

hms=# \s /tmp/save_queries.sql
Wrote history to file ".//tmp/save_queries.sql".
hms=# 
于 2020-06-17T09:29:42.580 回答
0

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

不过,需要提前进行一些额外的设置才能在 postgres 日志中捕获必要的数据,请参阅官方网站。

于 2016-07-29T06:20:31.113 回答
0

数据库本身没有历史记录,但如果您使用 DataGrip 数据管理工具,那么您可以检查您在 datagrip 中运行的历史记录。 在此处输入图像描述

于 2020-09-17T06:26:36.343 回答
0

不记录,但如果您正在对运行缓慢的查询进行实时故障排除,您可以查询pg_stat_activity视图以查看哪些查询处于活动状态、它们来自的用户/连接、它们何时启动等。例如...

SELECT *
FROM pg_stat_activity
WHERE state = 'active'

请参阅pg_stat_activity查看文档

于 2021-02-10T03:28:10.533 回答