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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值