1. 性能優化
開銷比較大:遊標
使用不兼容的數據類型:
無法通過索引,而是全盤掃描:①WHERE字段進行函數式或者表達式操作(儘量將操作移動到等號右邊,即不對列進行操作)、
②避免使用!=或<>、IS NULL或IS NOT NULL、IN ,NOT IN
③儘量避免在索引過的字符數據中,使用非打頭字母搜索
表之間的關聯條件有多個時,需要將所有條件都關聯起來,否則可能搜索結果不精確或搜索效率降低
消除對大型錶行數據的順序存取
儘管在所有的檢查列上都有索引,但某些形式的WHERE子句強迫優化器使用順序存取,
如SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008
把表的一個子集進行排序並創建視圖,有時能加速查詢,特別是需要聯表的時候。
能用between就不用IN
能用UNION ALL就不要用UNION 。UNION ALL不執行SELECT DISTINCT函數,這樣就會減少很多不必要的資源
儘量不要用SELECT INTO語句。SELECT INOT 語句會導致表鎖定,阻止其他用戶訪問該表
雖然UPDATE、DELETE語句的寫法基本固定,但是還是對UPDATE語句給點建議:
a) 儘量不要修改主鍵字段。
b) 當修改VARCHAR型字段時,儘量使用相同長度內容的值代替。
c) 儘量最小化對於含有UPDATE觸發器的表的UPDATE操作。
d) 避免UPDATE將要複製到其他數據庫的列。
e) 避免UPDATE建有很多索引的列。
f) 避免UPDATE在WHERE子句條件中的列。
--分析案例
SELECT DISTINCT A.PeriodID,PeriodName FROM UserMgr_TeachInfo_Period AS A INNER JOIN
V_UserMgr_TeachInfo_SubjectGlobalPeriod AS B ON A.PeriodID=B.PeriodID INNER JOIN
UserMgr_UserInfo_Teacher AS C ON C.SubjectIDs LIKE '%'+B.SubjectID+'%'
WHERE A.SchoolID=@SchoolID AND C.UserID=@UserID
--------------------------------------未完待續---------------------------------------