【问题标题】:How to log query for single table如何记录单个表的查询
【发布时间】:2016-07-06 12:49:21
【问题描述】:

具有返回 id 的简单插入

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

只需要此查询的日志执行时间。怎么做 ?我不想记录所有查询,只记录这个

【问题讨论】:

    标签: postgresql sql-insert postgresql-9.2


    【解决方案1】:

    如果使用命令行界面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 命令的持续时间(当然,还有函数调用的持续时间,但这应该不是问题)。

    【讨论】:

      猜你喜欢
      • 2021-09-26
      • 2016-09-22
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 2022-12-11
      • 2017-02-01
      相关资源
      最近更新 更多