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