SQL查詢效率注意事項小結

來源:互聯網
上載者:User

一、查詢條件精確,針對有參數傳入情況

二、SQL邏輯執行順序

  FROM-->JOIN-->WHERE-->GROUP-->HAVING-->DISTINCT-->ORDER-->TOP

三、橫向

查詢需要的欄位
當在SQL語句中串連多個表時,請使用表的別名並把別名首碼於每個Column上這樣一來,就可以減少解析的時間並減少那些由Column歧義引起的語法錯誤
四、少做重複工作

控制同一語句的多次執行,特別是一些基礎資料的多次執行是很多程式員很少注意的
減少多次的資料轉換
杜絕不必要的子查詢和串連表,子查詢在執行計畫一般解釋成外串連,多餘的串連錶帶來額外的開銷
五、關於零時表#與表變數@

如果語句很複雜,串連太多,可以考慮用暫存資料表和表變數分步完成
如果需要多次用到一個大表的同一部分資料,考慮用暫存資料表和表變數暫存這部分資料
如果需要綜合多個表的資料,形成一個結果,可以考慮用暫存資料表和表變數分步匯總這多個表的資料
關於暫存資料表和表變數的選擇,在資料量較多的情況下,暫存資料表的速度反而更快
SELECT INTO會比CREATE TABLE + INSERT INTO的方法快,但是SELECT INTO會鎖定TEMPDB的系統資料表SYSOBJECTS、SYSINDEXES、SYSCOLUMNS,在多使用者並發環境下,容易阻塞其他進程
六、子查詢

子查詢可以用IN、NOT IN、EXISTS、NOT EXISTS引入
NOT IN、NOT EXISTS的相互關聯的子查詢可以改用LEFT JOIN代替寫法
如果保證子查詢沒有重複 ,IN、EXISTS的相互關聯的子查詢可以用INNER JOIN 代替
IN的相互關聯的子查詢用EXISTS代替
七、索引

避免對索引欄位進行計算操作
SELECT ID FROM T WHERE NUM/2=100
應改為:
SELECT ID FROM T WHERE NUM=100*2
避免在索引欄位上使用NOT,<>,!=
避免在索引列上使用IS NULL和IS NOT NULL
避免在索引列上出現資料類型轉換
避免在索引欄位上使用函數
避免建立索引的列中使用空值
不要對索引欄位進行多欄位串連
WHERE FAME+'. '+LNAME='HAIWEI.YANG'
應改為:
WHERE FNAME='HAIWEI' AND LNAME='YANG'
八、多表串連

多表串連的時候,串連條件必須寫全,寧可重複,不要缺漏
串連條件盡量使用叢集索引
九、其他

在可以使用UNION ALL的語句裡,使用UNION ALL
避免在WHERE子句中使用IN,NOT IN,OR
避免使用耗費資源的操作,帶有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL語句會啟動SQL引擎執行,耗費資源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要執行兩次排序
LIKE ‘%5400%' 這種查詢不會引用索引,而LIKE ‘X5400%'則會引用範圍索引。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.