在PostgreSQL中,是否可以获取查询历史记录?

92

在Postgres中是否可以获取查询历史记录?并且是否可以获得每个查询所花费的时间?我目前正在尝试识别应用程序中的慢查询。

我正在使用Postgres 8.3.5版本。


3
我撤销了标签更改,因为这不是一个特定于SQL的问题。 - Chiwai Chan
3
请见 https://dev59.com/tXRB5IYBdhLWcg3wF0DH - Nemanja Boric
8个回答

88

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

使用这种方法很方便,因为你不需要成为数据库超级用户,就可以使用它,这与更改配置文件不同,并且如果你正在开发新代码并想要测试它,那么使用它会更容易。


如果未指定单位,则将log_min_duration_statement的值视为毫秒。 - brainLoop

6
您可以使用类似于以下的方式:
\s 

使用该命令将获取终端的所有命令历史记录,并可通过导出到文件中来保存:

\s filename

4
如果你想识别缓慢的查询,那么方法是使用log_min_duration_statement设置(在postgresql.conf中或使用ALTER DATABASE SET每个数据库设置)。
当你记录了数据后,你可以使用grep或一些专门的工具 - 如pgFouine或我自己的analyzer - 它缺乏适当的文档,但尽管如此 - 运行得相当不错。

4

如果您想查看命令行中执行的查询历史记录。答案是

根据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=# 

如果我们没有提供完整路径,那么默认位置会是什么? - Chaminda Bandara

2

不是记录日志,而是在实时排除运行缓慢的查询问题时,您可以查询pg_stat_activity视图以查看哪些查询处于活动状态、它们来自哪个用户/连接、何时开始等信息。例如...

SELECT *
FROM pg_stat_activity
WHERE state = 'active'

请查看pg_stat_activity视图文档


1

对于那些使用UI Navicat的用户,需要注意:

您必须设置您的偏好以利用文件作为存储历史记录的位置

如果此处留空,您的Navicat将为空白。

enter image description here

PS:我与Navicat或其关联公司没有任何关系或合作。只是想提供帮助。


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

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接