一文詳細講解SQL語句中可以提高執行效率的方法

語言: CN / TW / HK

1、操作符號:NOT IN操作符。此操作是強列推薦不使用的,因為它不能應用表的索引。推薦方案:用NOT EXISTS 或(外連線+判斷為空)方案代替 。因為他不走索引是表掃描。NOT IN會多次掃描表,使用EXISTS、NOT EXISTS、IN、LEFTOUTER JOIN來替代,特別是左連線。而Exists比IN更快,最慢的是NOT操作。

2、注意union和union all的區別。union比union all多做了一步distinct操作。能用union all的情況下儘量不用union(union操作符用於合併兩個或多個select 語句的結果集。)。
      如: 兩個表A和B都有一個序號欄位ID,要取兩個表中的ID欄位最大的值:

SELECT  

    max( id ) AS max_id 

FROM     

  ( SELECT  id  FROM表A  UNION ALL  SELECT  id FROM  表)  table

3、查詢時儘量不要返回不需要的行、列。另外在多表連線查詢時,儘量改成連線查詢,少用子查詢。

4、儘量少用檢視,它的效率低。對檢視操作比直接對錶操作慢,可以用儲存過程來代替它。特別的是不要用檢視巢狀,巢狀檢視增加了尋找原始資料的難度。我們看檢視的本質:它是存放在伺服器上的被優化好了的已經產生了查詢規劃的SQL。對單個表檢索資料時,不要使用指向多個表的檢視,直接從表檢索或者僅僅包含這個表的檢視上讀,否則增加了不必要的開銷,查詢受到干擾。為了加快檢視的查詢,SQLServers增加了檢視索引的功能。


5、建立合理的索引,對於插入或者修改比較頻繁的表,儘量慎用索引。因為如果表中存在索引,插入和修改時也會引起全表掃描。索引一般使用於where後經常用作條件的欄位上。

6、在表中定義欄位或者儲存過程、函式中定義引數時,將引數的大小設定為合適即可,勿設定太大。這樣開銷很大。

7、Between在某些時候比IN速度更快,Between能夠更快地根據索引找到範圍。用查詢優化器可見到差別。
select * from table where title in ('1','2') 
select * from table where between '1' and '2'是一樣的。由於in會在比較多次,所以有時會慢些。

8、在必要時對全域性或者區域性臨時表建立索引,有時能夠提高速度,但不是一定會這樣,因為索引也耗費大量的資源。他的建立同是實際表一樣。

9、WHERE子句後面的條件順序對大資料量表的查詢會產生直接的影響,如

select * from table where dy_dj = '1kv以下' and xh_bz=1

select * from zl_ table where xh_bz=1 and dy_dj = '1kv以下'

以上兩個SQL中dy_dj(電壓等級)及xh_bz(銷戶標誌)兩個欄位都沒進行索引,所以執行的時候都是全表掃描,如果dy_dj = '1KV以下'條件在記錄集內比率為99%,而xh_bz=1的比率只為0.5%,在進行第一條SQL的時候99%條記錄都進行dy_dj及xh_bz的比較,而在進行第二條SQL的時候0.5%條記錄都進行dy_dj及xh_bz的比較,以此可以得出第二條SQL的CPU佔用率明顯比第一條低。所以儘量 將範圍小的條件放在前面。

10、用or的字句可以分解成多個查詢,並且通過UNION 連線多個查詢。他們的速度只同是否使用索引有關,如果查詢需要用到聯合索引,用 UNION all執行的效率更高.多個OR的字句沒有用到索引,改寫成UNION的形式再試圖與索引匹配。一個關鍵的問題是否用到索引。

11、沒有必要時不要用DISTINCT和ORDER BY,這些動作可以改在客戶端執行。它們增加了額外的開銷。這同UNION和UNION ALL一樣的道理。

12、使用in時,在IN後面值的列表中,將出現最頻繁的值放在最前面,出現得最少的放在最後面,這樣可以減少判斷的次數

13、當用SELECTINTO時,它會鎖住系統表(sysobjects,sysindexes等等),阻塞其他的連線的存取。建立臨時表時用顯示宣告語句,在另一個連線中 select *from sysobjects可以看到 SELECT INTO 會鎖住系統表, Create table 也會鎖系統表(不管是臨時表還是系統表)。所以千萬不要在事物內使用它!!!這樣的話如果是經常要用的臨時表請使用實表,或者臨時表變數。

14、一般在GROUPBY和HAVING字句之前就能剔除多餘的行,所以儘量不要用它們來做剔除行的工作。他們的執行順序應該如下最優:select 的where字句選擇所有合適的行,Group By用來分組個統計行,Having字句用來剔除多餘的分組。這樣Group By和Having的開銷小,查詢快.對於大的資料行進行分組和Having十分消耗資源。如果Group BY的目的不包括計算,只是分組,那麼用Distinct更快

15、一次更新多條記錄比分多次更新每次一條快,就是說批處理好

16、慎用臨時表,臨時表儲存於tempdb庫中,操作臨時表時,會引起跨庫操作。儘量用結果集和表變數來代替它。

17、儘量將資料的處理工作放在伺服器上,減少網路的開銷,如使用儲存過程。儲存過程是編譯好、優化過,並且被組織到一個執行規劃裡、且儲存在資料庫中的SQL語句,是控制流語言的集合,速度當然快。

18、不要在一段SQL或者儲存過程中多次使用相同的函式或相同的查詢語句,這樣比較浪費資源,建議將結果放在變數裡再呼叫。這樣更快。

19、按照一定的次序來訪問你的表。如果你先鎖住表A,再鎖住表B,那麼在所有的儲存過程中都要按照這個順序來鎖定它們。如果你(不經意的)某個儲存過程中先鎖定表B,再鎖定表A,這可能就會導致一個死鎖。

 

粉絲特別福利

最新整理了2000G的java從入門到大神所需乾貨;

涵蓋java初級,中級,高階,架構課程;

涵蓋j2ee專案20個++;

涵蓋springcloud專案課程6個++

涵蓋初級到BAT筆試面試題

涵蓋簡歷模版專案素材

獲取方式:掃描下方二維碼,在臺打開回復 【福利】即可領取,資料持續更新!

 

                                                                        獲取2000Gjava從菜雞到大神資料

640?wx_fmt=png

                                                                       (回覆  福利  獲取)