PostgreSQL SQL調優案例實錄

最近在項目上遇到一個SQL問題,以爲挺有意思的,在這裏給你們分享下。事情的發生是這樣的:忽然有一天發現項目中數據庫Postgresql的一個主要的表(數據量也很大)相關的SQL session都很是慢,即便是隨便一個查詢語句也是這樣。如下是對排查問題過程的總結。sql


1)遇到這樣的問題,第一反應就是查看當前數據庫中活躍的sql session都有哪些?能夠經過以下語句進行查找:數據庫

select * from pg_stat_activity where state = 'active';

查找到這些結果以後,作一個簡單的概括總結,好比哪些SQL的比例佔大數。經過查找發現,活躍的SQL session並非不少,只是絕大數和系統的一個主表有關聯。
session

2) 發現相關的SQL,分別是簡單的select,delete:app

select * from table_name where xx_id = 'xxx';delete from table_name where xx_id = 'xxx';

這種SQL從結構上看,真的是很是簡單,不該該出現很長時間不返回結果的狀況。是否是數據庫CPU在此時比較忙碌?
ide


3)檢查數據庫資源消耗狀況,發現數據庫資源狀況很好,CPU使用率只有20%左右,那麼回到第2步,繼續進行問題排查。性能

4)仔細發現"xx_id" 這個字段沒有添加index,而且此表因爲是業務的主表,數據量很大,因此查找會全表掃描。其實delete語句也是同樣,若是是加where子句的delete或者update,子句中的篩查字段若是加index效率仍是比不加index要好。測試

5)經過SQL的執行計劃也能夠印證這一點。select 語句比較慢,CPU是在等待磁盤io的結果返回,因此數據庫磁盤統計數據(讀操做也是比較頻繁的)。spa

6)經過討論,解決方案就是在xx_id上添加索引,而且添加必要的filter條件,特別是主表主鍵相關code

結合以上基本就解決了這個問題。你們也能夠掃描並關注以下公衆號「TimTest」,會有更多性能測試相關內容分享。索引

qrcode_for_gh_39009e949117_258-1.jpg