1、選擇合適的資料類型
為列選擇最小化的資料類型
如果一列中的文本長度不一,使用VARCHAR而不是CHAR
不儲存Unicode不要使用NVARCHAR或者NCHAR
如果一行的長度不超過8000,使用VARCHAR而不是TEXT
對於僅存數位列要使用數字類型而不要用字元類型
不要使用字串類型儲存日期資料。
2、謹慎使用觸發器
保持觸發器內的代碼最小化
可能的情況下盡量用其他更高效的技術替代觸發器
盡量避免復原觸發器
3、只返回需要的資料
橫向來看,不要返回自己不需要的列,盡量不要使用select *
縱向來看,不要返回自己不需要的行,盡量使用where條件來過濾自己需要的內容
考慮使用TOP
考慮分頁
對於彙總查詢,可以用HAVING子句進一步限定返回的行。
4、盡量少做重複的工作
控制同一語句的多次執行,特別是一些基礎資料的多次執行。
減少多次的資料轉換,也許需要資料轉換是設計的問題,但是減少次數是可以做到的。
合并對同一表同一條件的多次UPDATE,
UPDATE操作不要拆成DELETE操作+INSERT操作的形式,雖然功能相同,但是效能差別是很大的。
不要寫一些沒有意義的查詢。
插入大量資料時,盡量不要使用迴圈,可以使用CTE,如果要使用迴圈,也放到一個事務中;
5、注意暫存資料表用法
在複雜系統中,暫存資料表很難避免,關於暫存資料表需要注意:
語句很複雜,串連太多,可以考慮用暫存資料表分步完成。
多次用到一個大表的同一部分資料,考慮用暫存資料表暫存資料。
需要綜合多個表的資料,形成一個結果,可以考慮用暫存資料表分步匯總這多個表的資料。
其他情況下,應該控制暫存資料表和表變數的使用。
注意定序。
關於暫存資料表產生使用SELECT INTO和CREATE TABLE + INSERT INTO的選擇.
6、避免使用遊標
對於某些逐行的處理考慮放在用戶端
考慮使用關聯的子查詢代替遊標
必須使用遊標時注意以下問題:
使用高效的遊標類型(例如 forward-only)
使用伺服器端遊標時保持結果集盡量小。
遊標使用結束時不能僅僅CLOSE,還要DEALLOCATE。
7、 恰當使用串連
對於頻繁串連的表用於串連的列需要有合適的索引
用於串連的列盡量使用相同的資料類型
避免將唯一值很少的列用過串連列,否則會導致scan
如果有些查詢需要對4個或更多的表進行串連,可以考慮低範化一些表
8、 其他需要注意的地方
問題發現的越早解決的成本越低,很多效能問題可以在編碼階段就發現,為了提早發現效能問題,需要注意:
程式員注意、關心各表的資料量。
編碼過程和單元測試過程盡量用資料量較大的資料庫測試,最好能用實際資料測試。
每個SQL語句盡量簡單
不要頻繁更新有觸發器的表的資料
注意資料庫函數的限制以及其效能