数据库中某张表查询异常/速度特别慢,解决思路
最近公司做项目,遇到一个问题: 查询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 的进程释放完之后 表的查询恢复正常
总结: 数据表如果有一条死锁,如果不得已释放, 后边的所有查询都会被阻塞,所以在设计程序时,要避免此事件的发生, 在发生死锁的时候,要第一时间将 死锁进程关闭