PostgreSQL 设置单条SQL的执行超时 - 防雪崩-阿里云开发者社区

开发者社区> 阿里云数据库> 正文
登录阅读全文

PostgreSQL 设置单条SQL的执行超时 - 防雪崩

简介:

标签

PostgreSQL , SQL超时


背景

设置单条SQL的执行超时,防雪崩。

通常来说可以在SQL发起前设置事务级超时参数,SQL执行结束,重置。(如果SQL异常退出,会自动重置事务级参数)

例子

begin;  
......  
set local statement_time='100ms';  
select count(*) from a;   -- 这条SQL的执行时间超过100MS则主动退出,并回滚整个事务    
set local statement_timeout to default;  
......  
end;  

函数级超时例子 - statement_timeout不可用

例如这个QUERY,我们想让它100毫秒超时。

select count(*) as cnt, id from a where id<$1 group by id;   

将它写到函数中,在函数中设置超时

create or replace function f1(int) returns setof record as $$  
declare  
begin  
  set local statement_timeout='100ms';  
  return query select count(*) as cnt, id from a where id<$1 group by id;   
end;  
$$ language plpgsql strict ;  

调用SQL改成这样

select cnt,id from f1(1) as t(cnt int8, id int);   

但是这么做实际上是没有效果的,原因是statement_timeout的设计之初是为交互性SQL设计的,在postgres.c中。

所以需要plpgsql超时,需要通过插件HOOK来实现。

https://www.postgresql.org/message-id/flat/200702201200.53535.xzilla%40users.sourceforge.net#200702201200.53535.xzilla@users.sourceforge.net

statement_timeout is measured across an entire interactive command, not  
  
individual commands within a function; and the timeout that applies to  
  
an interactive command is determined at its beginning.  So the above  
  
doesn't do what you think.  

参数级别

1、实例级

修改  
  
postgresql.conf  

2、库级

alter database dbname set parameter=?;  

3、用户级

alter role rolname set parameter=?;  

4、会话级

set parameter=?;  

5、事务级

begin;  
set local parameter=?;  
....  
end;  

6、函数级

alter function fun_name() set parameter=?;  

其他超时控制

1、空闲事务超时

idle_in_transaction_session_timeout = 2h   

2、锁等待超时

lock_timeout = 1s   

3、死锁检测超时间隔

deadlock_timeout = 1s  

https://www.postgresql.org/docs/9.4/static/runtime-config-client.html

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: