一文詳細講解SQL語句中可以提高執行效率的方法
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從菜雞到大神資料
(回覆 福利 獲取)
- 用Python講述:地理“經緯度”資料的4種轉換方法!
- 17 張程式設計師桌布(使用頻率很高)
- [總結]高效能人士的七個習慣
- 為什麼你的程式總是出現 bug?
- GB28181協議錯誤碼返回碼整理
- 還在用 Windows 自帶的搜尋工具嗎?你 out 啦!
- 動畫: 一個瀏覽器是如何工作的?
- 8小時刪除,這波資源碉堡了 ! @所有人
- 新手上路第一篇C語言部落格
- ESP8266_NONOS_SDK--UART實驗
- 2021-01-05
- 《軟體架構》總覽
- 修改Exchange資訊儲存佔用記憶體大小
- uart232串列埠之二——fpg內部迴環模擬
- 3.18PMP試題每日一題
- 2020-12-28
- 一文詳細講解SQL語句中可以提高執行效率的方法
- 小程式開發遇到的坑,知道下總是好的!
- 如何通過 Spring 框架進行JDBC操作?
- GSYVideoPlayer播放器框架使用、播放元件原始碼探究(一)