我在 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 秒内完成.)
这是为什么?