0

我在 postgres 数据库中有一个函数可以进行大量分析;它由一系列更新和插入语句组成,并最终返回一些输出。我想弄清楚哪些语句执行缓慢,而不需要查看日志文件。(我更喜欢使用 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 秒内完成.)

这是为什么?

4

1 回答 1

1

您使用的时间戳总是给出当前事务的开始。如果您查看手册,您将看到您想要clock_timestamp()的。

于 2013-05-14T08:23:30.523 回答