sql語句複雜度的優化就是在結果正確的前提下,將複雜、難以維護的sql語句拆分成獨立、易懂的sql片段,當然也要充份利用索引,減少表描的i/o次數,盡量避免表搜尋的發生。下面介紹降低sql語句複雜度的幾個建議
1、動態查詢語句
一些應用為了實現客戶端的靈活性,會根據使用者的選擇,動態拼出tsql語句,發給sql執行。
例如,在使用者介面上列出各種條件,讓使用者根據自己的喜好,輸入條件,進行組合查詢。這樣在功能上來講比較強大,但是在複雜度控制上就有可能會出問題。如果使用者選擇的條件太多,或者根據條件返回的記錄太多,就有可能會造成問題。而有些能夠過濾大量資料,或者在索引上的條件如果沒有被選上,就有可能造成在大表上的table
scan。最好在程式裡有動態語句複雜度的控制機制,限制選擇的條件限制返回記錄的數量。
2、檢視和儲存過程的深度
檢視和儲存過程能夠抽象出一些業務邏輯,簡化設計,是很推薦的做法。但是如果在引用檢視和儲存過程時不加注意,檢視套檢視,儲存過程嵌儲存過程,最後巢狀上四五層,那複雜度累積起來,可能會超出你想象。對sql的優化,也是很嚴重的考驗。所以在引用他們的時候,也要考慮累積的複雜度
3、**聯接的數量
為了支援複雜的業務邏輯,乙個應用往往會有成百上千的**,一些查詢往往會聯接十幾張甚至幾十張表。應用設計的時候對這樣的查詢要很慎重。如果**很大,十幾張表做聯接,肯定不會有好的效能。如果應用是支援資料分析系統,那可能還好。如果應用是乙個oltp系統,這樣的設計失敗的風險可能會很大。有時候可能需要降低資料庫正規化級別,多儲存一些冗餘資料列,以減少**聯接的數量
4、用多個簡單語句替代乙個複雜語句
如果乙個複雜的語句有很多張表要聯接,要做很多計算,很多時候,要根據表和表的邏輯關係,知道某一張表和另一張表如果先做聯接,可能會過濾掉更多資料。得到的小的結果集再做其他聯接,會更快。
類似的,有些計算可以先做,也可以後做,我們在了解了**的邏輯之後會知道是先做好還是後做好。可惜sql作為乙個電腦程式,在這方面沒有人那麼聰明。當語句太複雜的時候,他有可能看不出來了。
為了提高效能,對這種特別複雜的語句,可以把一句話拆成兩句,甚至三句分步做完,中間結果集,可以以臨時表的形式存放。這樣做對程式設計師來講做了很多事,但是對sql來講,大大簡化了複雜度。很多時候對效能也會有幫助
:donet技術分享平台
閱讀原文
變換迴圈變數,降低複雜度
在一些問題中,如果適當選擇迴圈變數,將會降低程式的複雜度,例如判斷子串的問題 判斷字串 s 是不是 t的子串,有兩種方案 方案一 思路 對s中的元素遍歷,根據貪心的思想,搜尋t中第乙個該元素,若不存在,則說明s不是t的子串。注意,s中的元素在t中的相對位置必須保持不變,所以每一次搜尋時,應該從上一次...
常見降低圈複雜度方法
圈複雜度計算方式 圈複雜度 cc 判斷條件個數 1其中1代表函式本身的複雜度 關鍵字 if,else if,for,while,case,catch等。對if,if else,if else if for,switch while語句進行簡要說明 之後函式的圈複雜度是所有的語句判斷數加函式本身 常用...
複雜度 程式開發中降低複雜度的核心方法
降低複雜度的核心方法主要三個步驟 第一步,暴力解法。在沒有任何時間 空間約束下,完成 任務的開發。沒有太多的套路,只要圍繞你面臨的問題出發,大膽發揮想象去嘗試解決即 無效操作處理。將 中的無效計算 無效儲存剔除,降低時間或空間複雜度。需要學會並掌握遞迴 二分法 排序演算法 動態規劃等常用的演算法思維...