數據庫中某張表查詢異常/速度特別慢,解決思路


最近公司做項目,遇到一個問題:  查詢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 的進程釋放完之后 表的查詢恢復正常

 

總結: 數據表如果有一條死鎖,如果不得已釋放, 后邊的所有查詢都會被阻塞,所以在設計程序時,要避免此事件的發生, 在發生死鎖的時候,要第一時間將 死鎖進程關閉

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM