問題背景:
一、客戶環境連續多次出現性能問題,系統登入異常,數據庫CPU告警。
處理過程:
1>協助排查數據庫性能問題時發現如下兩個較頻繁的SQL導致嚴重的性能問題(均使用了視圖合並多表數據):
1 1. SELECT nodename FROM view_name1 WHERE id = xxx; 2 3 2. SELECT a.id rid,accounttype,belongto,resourceId,belongtoshow FROM view_name2 a 4 LEFT JOIN tablename1 b 5 ON a. col1= b.col1 6 WHERE a.col1> 0 ;
2> 上面兩個SQL使用到了視圖(視圖通過union all合並了兩張表的數據)。下面以t001和t002為例分別給出直接查詢原表和使用視圖查詢的執行計划對比
(其中t001和t002表中id列均有索引):直接查詢原表后對結果進行合並:

3>通過視圖進行查詢:
1 create view t_view as 2 select * from t001 3 union all 4 select * from t002
4> 對比執行計划可以發現,使用視圖進行數據union all會導致索引失效,使用了全表掃描的方式進行數據檢索,在並發高的情況下,
占用較多的磁盤IO,嚴重消耗數據庫的CPU和IO資源,影響到整體的數據庫性能,現階段已發現較多的這種使用視圖的代碼,應避免使用視圖,采用分開查詢各表的方式。
————————————————
聚焦技術與人文,分享干貨,共同成長更多內容請關注“數據與人”


