【发布时间】:2013-12-02 15:04:14
【问题描述】:
我有以下存储过程,insertMessageOne:
CREATE OR REPLACE FUNCTION insertMessageOne(sender_id INT, receiver_id INT, queue_id INT, context INT, priority INT, text varchar(2000))
RETURNS BOOLEAN
AS $$
DECLARE
start timestamp;
stop timestamp;
BEGIN
start = clock_timestamp();
INSERT INTO message(sender_id, receiver_id, queue_id, context, priority, text) VALUES($1,$2,$3,$4,$5,$6);
stop = clock_timestamp();
RAISE NOTICE 'Timestamp: (%) senderId: (%) insertMessageOne: (%)', stop, sender_id, stop - start;
RETURN TRUE;
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'EXCEPTION: INSERT SINGLE-Q MESSAGE FAILED';
RETURN FALSE;
END;
$$ LANGUAGE plpgsql;
如上所示,我使用存储过程开始和结束时的开始和停止时间戳来测量此存储过程的执行时间。但是,由于实际的事务提交发生在存储过程结束后,因此记录的时间会减少 10-20 毫秒(参见Execution time of a Prepared statement's executeQuery() method vs. corresponding Stored procedure execution time),通常是提交事务所需的。如何记录包括提交事务所用时间的时间? pgBench 对我来说可能不够好,因为当实际的实时应用程序(来自中间件)调用这个存储过程时,我想要这些数字。
【问题讨论】:
-
您是否尝试过为
psql启用计时并从中发送查询? -
不能在中间件中记录持续时间吗?
-
中间件日志记录也会包括网络延迟。要排除它,必须在数据库本身中完成日志记录。
标签: postgresql stored-procedures logging transactions