Document

数据库中某张表查询异常/速度特别慢,解决思路

最近公司做项目,遇到一个问题:  查询DB(PostgresSQL) 某张表速度异常的慢(甚至是打不开),考虑了很久,以为是DB 问题, 但是其他表正常, 后来想Drop 掉该表,发现删也删不掉

1 SELECT * FROM pg_stat_activity where datname='DB名称' and usename='用户名称'  order by query_start desc
1 -- 查询该表名是否被锁,有查询结果则证明该表被锁
2 select oic from pg_class where relname='DB表名'
3 
4 -- 根据以上SQL查询出的OIC 可以查出被锁表的所有被锁进程
5 select pid from pg_locks where relation='4106774'

 

通过以上指令呢 可以查询出当前DB 中所有的进程,可以观察到 其中一个栏位叫 wait_event_type  我发现在我的查询中出现了很多次 Lock , 意思就是说: 我的DB 在执行某个任务时 误将我的 该表造成了死锁,所以要想解决这问题呢! 就是必须将死锁的进程杀掉或者想办法释放死锁

--根据进程PID 可以杀掉进程、此方法只对select 造成的死锁有效
select pg_cancel_backend(进程PID)

--根据线程PID 可以杀掉各种进程
select pg_terminate_backend(pid int)

将所有造成Lock 的进程释放完之后 表的查询恢复正常

 

总结: 数据表如果有一条死锁,如果不得已释放, 后边的所有查询都会被阻塞,所以在设计程序时,要避免此事件的发生, 在发生死锁的时候,要第一时间将 死锁进程关闭

 

posted @ 2021-12-28 11:02  苏什么苏  阅读(1877)  评论(0编辑  收藏  举报