我们经常会遇到死锁的表,通过以下命令,可以查询到死锁的表。
PG死锁的一次处理。 --查询阻塞的sql( 死锁了,没有执行通过的sql ) select * from pg_stat_activity aa,( select a.locktype,a.database,a.pid,a.mode,a.relation,b.relname from pg_locks a join pg_class b on a.relation=b.oid where upper(b.relname)='FX_WDSJ_DSZH' ) bb where aa.pid=bb.pid and aa.waiting='t'
遇到过有表不走hash join走nested loop的情况。
执行过analyze table_name; 得以解决。
有遇到过表膨胀的情况,就是postgresql对单一表进行大量的增删改,缺没有降低水位线。
使用vacuum full table 可以降低水位线,注意此操作会锁表。
对订单汇总表进行的vaccum操作后,函数运行时长从20min下降到4min
函数内不要进行索引的操作,会产生表的排它锁。索引需要配置成concurrently关键字。
临时表加速:
临时表加速: GREATE UNLOGGED TABLE XXX 可以加速临时表创建过程,提高IO速度
对于异常sql的处理:
查看运行的链接状态 SELECT * from pg_stat_activity ; -- 取消那条数据的procpid值 SELECT pg_cancel_backend(6789); -- 强制杀死那条数据的procpid值 杀进程 select pg_terminate_backend(6789);