天天看點

SQL查詢效率介紹及9個注意事項

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

二、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%’則會引用範圍索引。