mssql 效能最佳化的一些認識
來源:互聯網
上載者:User
1.盡量少使用遊標
原因很簡單;就是遊標的演算法是最原始的電腦演算法(和for.if等語句一樣,一條條搜尋來算;效率極低);
而sql語句用的是集合運算;速度則快的多;如果用索引速度則很快(用了指標).
2.建立索引.
a.叢集索引:
叢集索引是磁碟儲存和邏輯顯示是一樣的
mssql表的主鍵一般是叢集索引;主鍵(每一條記錄唯一確定);
建立的主鍵自動會是叢集索引;
如有一個非常大的表(有百萬行);很長時間磁碟儲存上會有類似片段(磁碟填充率效率低;一般是頻繁刪除造成的);
要提高它的效能的最簡潔辦法是:把這個表的主鍵去掉再儲存後;然後重新設主鍵再儲存;
(這個表就會在磁碟上重新整理排序;效能當然會提高喲)
b.非叢集索引:
非叢集索引是在外面建立小的附加表(一種樹形結構;大多數是B或B+樹);
讀(遍曆select等sql語句)表特快;但寫(update;delete.insert等sql語句)表效能會略微下降.
針對資料量大的表建議非叢集索引不要超過3個(節省額外磁碟負擔).
不要給類似“性別”列建立索引.
3.死結:
是指有線程在讀一條記錄;別的線程讀這條記錄就要等待;
在mssql中只要長期占那條記錄的線程去掉;死結就會解除.
在mssql中鎖是針對每一行記錄(所以效能不錯).
經常產生鎖的原因有:
a.在sql語句中使用事務語句(特別是事務中當查詢比較耗時).
b.在前台的應用程式的connetion衝突(未關閉).
c.多表聯集查詢(尤其是在開啟大的資料集時).
4.sql語句最佳化
a."is null" "not" "or" "in"不會用索引
b.避免在索引列上使用計算或函數處理(索引會大失效能).還有"%";有的甚至會全失索引效能
c.SELECT中避免使用 ‘ * ‘(寧可把需要欄位列出來;而不要用*去把所有的欄位都列出來).
d.避免相互關聯的子查詢(select中套select).
e.where的條件中"=>exists>in"(指效能)
f."order by" "group by" "having" "distinct"等語句要慎用(因為它們效率不高;它們是先把資料到暫存資料表中再進行處理的).
g.叢集索引如有2個欄位組成(tt1和tt2);tt1在前面;where的條件中如只用tt1欄位來判斷;就會用到一半的叢集索引;
where的條件中如tt1和tt2欄位都用來判斷了;就會全用到叢集索引;
where的條件中如只用tt2欄位來判斷;就會用不到叢集索引了;
5.盡量不要使用TEXT資料類型
除非你使用TEXT處理一個很大的資料,否則不要使用它。因為它不易於查詢,速度慢,用的不好還會浪費大量的空間。
一般的,VARCHAR可以更好的處理你的資料。
6.盡量不要使用暫存資料表
盡量不要使用暫存資料表,除非你必須這樣做。一般使用子查詢可以代替暫存資料表。使用暫存資料表會帶來系統開銷,
如果前台的代碼你是使用資料庫連接池而暫存資料表卻自始至終都存在。SQL Server提供了一些替代方案,比如Table資料類型。
7.盡量少使用外鍵和觸發器。
因為在mssql中這些功能的效能做得不是很好;隨便動一下表(它就會到相關的表去搞判斷;有很多情況並不需要);在後台消耗資源大.
寧可在前台多寫些相關表的操作的代碼.