Postgresql

為什麼“SET LOCAL statement_timeout”不能按預期使用 PostgreSQL 函式?

  • November 19, 2014

我的理解是 PostgreSQL 函式的執行類似於事務。但是,當我嘗試在函式中“SET LOCAL statement_timeout”時,它不起作用。以下是它在事務中的工作方式:

BEGIN; 
 SET LOCAL statement_timeout = 100; 
 SELECT pg_sleep(10); 
COMMIT;

結果是(如預期的那樣):

BEGIN
SET
ERROR:  canceling statement due to statement timeout
ROLLBACK

但是,如果我將相同的命令放在函式體中:

CREATE OR REPLACE FUNCTION test() RETURNS void AS '
   SET LOCAL statement_timeout = 100;
   SELECT pg_sleep(10);
' LANGUAGE sql;

SELECT test();

沒有發生超時,該函式test()需要 10 秒才能執行。

請告知為什麼這兩種情況不同,以及如何更正它以在函式中設置語句超時。

這種方式statement_timeout有效,當伺服器收到來自客戶端的新命令時,時間開始計算。

在伺服器端函式內啟動的查詢不是來自客戶端的命令,它們不會重置該計時器或將新計時器推送到計時器堆棧上。

這就是為什麼SET LOCAL statement_timeout = 100;沒有效果。

如果一個函式發生了,SET statement_timeout = 100;它只會從客戶端的下一個命令開始生效。

我看不到任何方法可以控制函式內單個查詢的執行時間。

引用自:https://dba.stackexchange.com/questions/82977