SQL语句执行卡住类问题 可能影响 SQL执行时间很长未返回结果,导致相关业务受影响。 解决步骤 1. 执行以下SQL,进一步检查阻塞会话ID对应的SQL语句,是否被其它会话阻塞; select pid,pgblockingpids(pid),EXTRACT(EPOCH FROM (now()querystart)), waiteventtype,waitevent,query,query from pgstatactivity where pid11582; 2. 与业务侧确认,阻塞的会话是否可以停掉;如果可以停掉,执行以下SQL停掉阻塞的会话: 取消会话,执行以下SQL,可能不成功,其中xxx为需要停掉的SQL会话的PID: select pgcancelbackend(xxx); 如果取消会话不成功,执行以下SQL,其中xxx为需要停掉的SQL会话的PID: select pgterminatebackend(xxx); 3. 常见的SQL阻塞场景:执行DDL语句,例如TRUNCATE TABLE清空表、ALTER TABLE修改表结构,会申请独占锁,如果有会话在访问这个表,那么DDL语句就会被阻塞,等待这个表上的会话结束;后续这个表上的SELECT语句又会被DDL语句阻塞;造成更大面积的阻塞。 针对此类场景,有如下建议: 1)DDL语句属于表结构变更语句,生产环境中不应随意执行,需要申请维护窗口; 2)在执行DDL语句前,可以先检查该该表上是否有会话,在允许的前提下先清理会话,再执行DDL语句; 3)所有DDL语句执行产,建议会话级设置locktimeout参数,在一段时间内如果没有申请到锁就退出,避免造成大面积SQL阻塞;例如 set locktimeout'10s',那么DDL语句如果10秒没有获取到独占锁,就会退出。