什么是在不查看日志文件的情况下跟踪postgresql中查询的时间的好方法?

时间:2013-05-14 07:16:35

标签: postgresql

我在postgres数据库中有一个功能,可以进行大量的分析;它由一系列update和insert语句组成,最终会抛出一些输出。我想知道哪些语句执行缓慢,而不查看日志文件。 (我比使用SQL更熟悉,比如perl,编写日期/时间算术查询以发现问题。)

我有一张表,activity_log:

CREATE TABLE activity_log
(
action character varying(250),
action_date date,
action_tune time without time zone
);

然后在我的函数中,在每次INSERT / UPDATE之后我写了像

这样的语句
INSERT INTO activity_log (action_date, action_tune, action) 
VALUES (current_date, current_timestamp, 'INSERT to base_model');

所以函数看起来像这样:

CREATE FUNCTION rebucket(pos_control character varying, absolute_max_cpc numeric, absolute_max_bucket character varying)
RETURNS integer AS
$BODY$
DECLARE qty INT;

BEGIN

INSERT INTO activity_log (action_date, action_tune, action) 
VALUES (current_date, current_timestamp, 'Off we go');

-- Do something that takes 5 minutes

INSERT INTO activity_log (action_date, action_tune, action) 
VALUES (current_date, current_timestamp, 'INSERT to base_model');

-- Then do something else that also takes about 5 minutes ...

INSERT INTO activity_log (action_date, action_tune, action) 
VALUES (current_date, current_timestamp, 'INSERT to diagnostics');

END 
$BODY$
LANGUAGE plpgsql VOLATILE

我过去在其他数据库中已经没有这个了,但是当我在Postgres中尝试这种方法(Windows 7上的9.1)时,每当我运行整个函数时,activity_log中的日期和时间就完全相同了。函数中的每个语句:在上面的例子中,

SELECT * FROM activity_log

让我

Off we go              2013-05-13  12:33:23:386
INSERT to base_model   2013-05-13  12:33:23:386
INSERT to diagnostics  2013-05-13  12:33:23:386

(该功能需要5分钟到一个小时才能运行,具体取决于我们提供的参数,并且其中有超过20种不同的语句,因此每个语句似乎不太可能在相同的1/100秒内完成。)

为什么?

1 个答案:

答案 0 :(得分:1)

您使用的时间戳始终提供当前事务的开始。如果你查看manuals,就会看到你想要clock_timestamp()