在长时间运行的 PL/pgSQL 存储过程中确定当前正在执行的语句

use*_*805 5 postgresql monitoring stored-procedures

我在 PostgreSQL 中有一个长期运行的 PL/pgSQL 存储过程。如何确定其中当前正在执行的语句?

Erw*_*ter 4

一种粗略但有效的方法(在任何版本中都可用)是在 plpgsql 函数中发出通知:

CREATE OR REPLACE FUNCTION foo() RETURNS void AS
$func$
BEGIN
PERFORM ...
RAISE NOTICE 'step1';

INSERT ...
RAISE NOTICE 'step2';

DELETE ...
END
$func$ LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)

另一种可能性是使用自动解释

SET auto_explain.log_nested_statements = ON;
Run Code Online (Sandbox Code Playgroud)

第二种方法给你的比你要求的要多得多。两者都是拐杖和变通办法,或多或少具有侵入性@Craig在评论中指出 Pavel 9.4
中即将推出的功能似乎是一个重大改进:

GET DIAGNOSTICS text_var = PG_CONTEXT;
Run Code Online (Sandbox Code Playgroud)

它已经记录在 /devel 手册中