如何记录单个表的查询

时间:2016-07-06 12:49:22

标签: postgresql sql-insert postgresql-9.2

具有返回id的简单插入

INSERT INTO "public"."mytbl"  ("col1",  "col2" , "col3" , "col4",  "col5") 
values  ('test',  'test' ,  null ,  'test',  null) RETURNING id; 

仅希望此查询的日志执行时间。怎么做 ?我不希望记录所有查询,只有这一个

1 个答案:

答案 0 :(得分:0)

如果使用命令行界面psql,则只需输入

即可
\timing

并且每个语句执行后你都会得到它的持续时间。

如果要将持续时间记录到PostgreSQL日志文件中,可以通过设置参数log_min_duration_statement = 0来实现。 问题是此参数只能由超级用户设置,您可能希望以不同的用户身份运行该语句。

使普通用户能够记录语句持续时间的一种方法是使用超级用户拥有的SECURITY DEFINER函数,并设置当前事务持续时间的参数:

CREATE OR REPLACE FUNCTION logduration() RETURNS void AS
  'SET LOCAL log_min_duration_statement=0'
   LANGUAGE sql SECURITY DEFINER;

REVOKE EXECUTE ON FUNCTION logduration() FROM PUBLIC;
GRANT EXECUTE ON FUNCTION logduration() TO laurenz;

然后用户laurenz可以执行以下操作:

START TRANSACTION;
SELECT logduration();
INSERT INTO "public"."mytbl" ...
COMMIT;

您的日志将仅包含INSERT命令的持续时间(以及funxtion调用的持续时间,但这应该不是问题)。