SQL語句復雜度的優化就是在結果正確的前提下,將復雜、難以維護的SQL語句拆分成獨立、易懂的SQL片段,當然也要充份利用索引,減少表描的I/O次數,盡量避免表搜索的發生。下面介紹降低SQL語句復雜度的幾個建議
1、動態查詢語句
一些應用為了實現客戶端的靈活性,會根據用戶的選擇,動態拼出TSQL語句,發給SQL運行。
例如,在用戶界面上列出各種條件,讓用戶根據自己的喜好,輸入條件,進行組合查詢。這樣在功能上來講比較強大,但是在復雜度控制上就有可能會出問題。如果用戶選擇的條件太多,或者根據條件返回的記錄太多,就有可能會造成問題。而有些能夠過濾大量數據,或者在索引上的條件如果沒有被選上,就有可能造成在大表上的table
scan。最好在程序里有動態語句復雜度的控制機制,限制選擇的條件限制返回記錄的數量。
2、視圖和存儲過程的深度
視圖和存儲過程能夠抽象出一些業務邏輯,簡化設計,是很推薦的做法。但是如果在引用視圖和存儲過程時不加注意,視圖套視圖,存儲過程嵌存儲過程,最后嵌套上四五層,那復雜度累積起來,可能會超出你想象。對SQL的優化,也是很嚴重的考驗。所以在引用他們的時候,也要考慮累積的復雜度
3、表格聯接的數量
為了支持復雜的業務邏輯,一個應用往往會有成百上千的表格,一些查詢往往會聯接十幾張甚至幾十張表。應用設計的時候對這樣的查詢要很慎重。如果表格很大,十幾張表做聯接,肯定不會有好的性能。如果應用是支持數據分析系統,那可能還好。如果應用是一個OLTP系統,這樣的設計失敗的風險可能會很大。有時候可能需要降低數據庫范式級別,多保存一些冗余數據列,以減少表格聯接的數量
4、用多個簡單語句替代一個復雜語句
如果一個復雜的語句有很多張表要聯接,要做很多計算,很多時候,要根據表和表的邏輯關系,知道某一張表和另一張表如果先做聯接,可能會過濾掉更多數據。得到的小的結果集再做其他聯接,會更快。
類似的,有些計算可以先做,也可以后做,我們在了解了表格的邏輯之后會知道是先做好還是后做好。可惜SQL作為一個計算機程序,在這方面沒有人那么聰明。當語句太復雜的時候,他有可能看不出來了。
為了提高性能,對這種特別復雜的語句,可以把一句話拆成兩句,甚至三句分步做完,中間結果集,可以以臨時表的形式存放。這樣做對程序員來講做了很多事,但是對SQL來講,大大簡化了復雜度。很多時候對性能也會有幫助
歡迎關注我的公眾號(同步更新文章):DoNet技術分享平臺
閱讀原文