1. 盡量不要使用 or,使用or會引起全表掃描,將大大降低查詢效率。
2.alice like '%"&abigale&"%' 會使索引不起作用(針對sqlserver)
3.經(jīng)過實踐驗證,charindex()并不比前面加%的like更能提高查詢效率,并且charindex()會使索引失去作用(指sqlserver數(shù)據(jù)庫)
4.字段提取要按照“需多少、提多少”的原則,避免“select *”,盡量使用“select 字段1,字段2,字段3........”。實踐證明:每少提取一個字段,數(shù)據(jù)的提取速度就會有相應(yīng)的提升。提升的速度還要看您舍棄的字段的大小來判斷。
5. order by按聚集索引列排序效率最高。一個sqlserver數(shù)據(jù)表只能建立一個聚集索引,一般默認為ID,也可以改為其它的字段。
6.能使用exists和not exists盡量使用,避免使用in或not in
7.能使用表連接盡量使用,避免使用exists和not exists
8.SET NOCOUNT ON
9.正確使用UNION和UNION ALL
10.慎用SELECT DISTINCT
11.少用游標(biāo)
12. 使用表的別名(Alias):
當(dāng)在SQL語句中連接多個表時,請使用表的別名并把別名前綴于每個Column上,這樣可以減少解析的時間并減少那些由Column歧義引起的語法錯誤。
.盡量少使用游標(biāo) 原因很簡單;就是游標(biāo)的算法是最原始的計算機算法(和for.if等語句一樣,一條條搜索來算;效率極低); 而sql語句用的是集合運算;速度則快的多;如果用索引速度則很快(用了指針).
2.創(chuàng)建索引. a.聚集索引: 聚集索引是磁盤存儲和邏輯顯示是一樣的 mssql表的主鍵一般是聚集索引;主鍵(每一條記錄唯一確定); 創(chuàng)建的主鍵自動會是聚集索引; 如有一個非常大的表(有百萬行);很長時間磁盤存儲上會有類似碎片(磁盤填充率效率低;一般是頻繁刪除造成的); 要提高它的性能的最簡潔辦法是:把這個表的主鍵去掉再保存后;然后重新設(shè)主鍵再保存; (這個表就會在磁盤上重新整理排序;性能當(dāng)然會提高喲) b.非聚集索引: 非聚集索引是在外面建立小的附加表(一種樹形結(jié)構(gòu);大多數(shù)是B或B+樹); 讀(遍歷select等sql語句)表特快;但寫(update;delete.insert等sql語句)表性能會略微下降. 針對數(shù)據(jù)量大的表建議非聚集索引不要超過3個(節(jié)省額外磁盤負擔(dān)). 不要給類似“性別”列創(chuàng)建索引.
3.死鎖: 是指有線程在讀一條記錄;別的線程讀這條記錄就要等待; 在mssql中只要長期占那條記錄的線程去掉;死鎖就會解除. 在mssql中鎖是針對每一行記錄(所以性能不錯). 經(jīng)常產(chǎn)生鎖的原因有: a.在sql語句中使用事務(wù)語句(特別是事務(wù)中當(dāng)查詢比較耗時). b.在前臺的應(yīng)用程序的connetion沖突(未關(guān)閉). c.多表聯(lián)合查詢(尤其是在打開大的數(shù)據(jù)集時).
4.sql語句優(yōu)化 a.'is null' 'not' 'or' 'in'不會用索引 b.避免在索引列上使用計算或函數(shù)處理(索引會大失性能).還有'%';有的甚至?xí)饕阅?br>c.SELECT中避免使用 ‘ * ‘(寧可把需要字段列出來;而不要用*去把所有的字段都列出來). d.避免相關(guān)子查詢(select中套select). e.where的條件中'=>exists>in'(指性能) f.'order by' 'group by' 'having' 'distinct'等語句要慎用(因為它們效率不高;它們是先把數(shù)據(jù)到臨時表中再進行處理的). g.聚集索引如有2個字段組成(tt1和tt2);tt1在前面;where的條件中如只用tt1字段來判斷;就會用到一半的聚集索引; where的條件中如tt1和tt2字段都用來判斷了;就會全用到聚集索引; where的條件中如只用tt2字段來判斷;就會用不到聚集索引了;
5.盡量不要使用TEXT數(shù)據(jù)類型 除非你使用TEXT處理一個很大的數(shù)據(jù),否則不要使用它。因為它不易于查詢,速度慢,用的不好還會浪費大量的空間。 一般的,VARCHAR可以更好的處理你的數(shù)據(jù)。
6.盡量不要使用臨時表 盡量不要使用臨時表,除非你必須這樣做。一般使用子查詢可以代替臨時表。使用臨時表會帶來系統(tǒng)開銷, 如果前臺的代碼你是使用數(shù)據(jù)庫連接池而臨時表卻自始至終都存在。SQL Server提供了一些替代方案,比如Table數(shù)據(jù)類型。
7.盡量少使用外鍵和觸發(fā)器。 因為在mssql中這些功能的性能做得不是很好;隨便動一下表(它就會到相關(guān)的表去搞判斷;有很多情況并不需要);在后臺消耗資源大. 寧可在前臺多寫些相關(guān)表的操作的代碼.
|