SQL SERVER 視圖優化經歷


系統中要求對HIS數據進行效益統計,因為HIS數據是需要第三方提供接口導入的,不清楚數據量大小,所以視圖以業務為主未對其做性能優化(當時編寫試圖時就是幾條簡單的測試數據)

如今在項目接口實施完成后查看視圖執行效率,發現執行了很久很久,具體執行時間忘記了,書寫不規范,性能兩行淚

(HIS系統就提供了近三千萬條數據)

發現不僅僅浪費了大量時間,還占用了大量內存空間

我首先就是想到了建索引,速度上快了些

 

然后查看視圖代碼,縮減代碼量及關注執行時間

因為視圖業務較復雜,涉及的表較多

首先對嵌套查詢的語句單獨測試,並優化

eg.   將一個原本用left join連接的操作進行優化(這幾張表數據量很小,最多的四萬條,最小的幾百條)

很普通的左外鏈接,看一下現在的性能,如此簡單的表連接加上了計算列后耗費了三十多秒😂,這個不能忍

 

主要開銷集中在計算上

而且注意看這個箭頭很粗,表明數據量很大,在這里產生了四千四百萬的數據,占用了1.7GB空間,對內存的消耗挺嚴重的

 

 根據以上的結果,對於這段SQL,有兩點可以優化

1、消除左外鏈接

2、計算列計算之前盡可能減少數據量

 

准備優化

我們先看看內連接和左外鏈接的定義

內連接:內聯接使用比較運算符根據每個表共有的列的值匹配兩個表中的行。例如,檢索 students和courses表中學生標識號相同的所有行。

左外聯接:左外聯接的結果集包括  LEFT OUTER子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值。       

從定義來看內連接的效率要高一些,所以要盡可能的消除左外鏈接

 

select子句中包含了很多計算列,這讓CPU開銷不小,所以我打算分開計算列,來達到計算時數據量較小的可能,代碼優化后如下

 

 

優化后執行速度😱,被驚訝到了

瞬間有動力繼續優化了,雖然剛才優化的是最簡單的一部分,如圖🙃

 


免責聲明!

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



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