在Postgres中是否可以获取查询历史记录?并且是否可以获得每个查询所花费的时间?我目前正在尝试识别应用程序中的慢查询。
我正在使用Postgres 8.3.5版本。
在Postgres中是否可以获取查询历史记录?并且是否可以获得每个查询所花费的时间?我目前正在尝试识别应用程序中的慢查询。
我正在使用Postgres 8.3.5版本。
数据库本身没有历史记录,如果您使用的是 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
使用这种方法很方便,因为你不需要成为数据库超级用户,就可以使用它,这与更改配置文件不同,并且如果你正在开发新代码并想要测试它,那么使用它会更容易。
\s
使用该命令将获取终端的所有命令历史记录,并可通过导出到文件中来保存:
\s filename
如果您想查看命令行中执行的查询历史记录。答案是
根据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=#
不是记录日志,而是在实时排除运行缓慢的查询问题时,您可以查询pg_stat_activity
视图以查看哪些查询处于活动状态、它们来自哪个用户/连接、何时开始等信息。例如...
SELECT *
FROM pg_stat_activity
WHERE state = 'active'
对于那些使用UI Navicat的用户,需要注意:
您必须设置您的偏好以利用文件作为存储历史记录的位置
。
如果此处留空,您的Navicat将为空白。
PS:我与Navicat或其关联公司没有任何关系或合作。只是想提供帮助。
pgBadger是另一个选项 - 也在这里列出:https://github.com/dhamaniasad/awesome-postgres#utilities
需要一些额外的设置来提前捕获Postgres日志中所需的数据,请参阅官方网站。