1. 程式人生 > >SQL編碼中註意的性能問題

SQL編碼中註意的性能問題

insert 遊標 而不是 選擇 class str 字符串 它的 div

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、避免使用遊標
對於某些逐行的處理考慮放在client
考慮使用關聯的子查詢取代遊標
必須使用遊標時註意下面問題:
使用高效的遊標類型(比如 forward-only)
使用server端遊標時保持結果集盡量小。


遊標使用結束時不能只CLOSE,還要DEALLOCATE。
7、 恰當使用連接
對於頻繁連接的表用於連接的列須要有合適的索引
用於連接的列盡量使用同樣的數據類型
避免將唯一值非常少的列用過連接列,否則會導致scan
假設有些查詢須要對4個或很多其它的表進行連接,能夠考慮低範化一些表
8、 其它須要註意的地方


問題發現的越早解決的成本越低,非常多性能問題能夠在編碼階段就發現,為了提早發現性能問題,須要註意:
程序猿註意、關心各表的數據量。


編碼過程和單元測試過程盡量用數據量較大的數據庫測試,最好能用實際數據測試。
每一個SQL語句盡量簡單
不要頻繁更新有觸發器的表的數據
註意數據庫函數的限制以及其性能

SQL編碼中註意的性能問題