盡量不要使用 or使用or會引起全表掃描將大大降低查詢效率
alice like %&abigale&% 會使索引不起作用(針對sqlserver)
經過實踐驗證charindex()並不比前面加%的like更能提高查詢效率並且charindex()會使索引失去作用(指sqlserver數據庫)
字段提取要按照需多少提多少的原則避免select *盡量使用select 字段字段字段實踐證明每少提取一個字段數據的提取速度就會有相應的提升提升的速度還要看您捨棄的字段的大小來判斷
order by按聚集索引列排序效率最高一個sqlserver數據表只能建立一個聚集索引一般默認為ID也可以改為其它的字段
能使用exists和not exists盡量使用避免使用in或not in
能使用表連接盡量使用避免使用exists和not exists
SET NOCOUNT ON
正確使用UNION和UNION ALL
慎用SELECT DISTINCT
少用游標
使用表的別名(Alias)
當在SQL語句中連接多個表時請使用表的別名並把別名前綴於每個Column上這樣可以減少解析的時間並減少那些由Column歧義引起的語法錯誤
盡量少使用游標
原因很簡單;就是游標的算法是最原始的計算機算法(和forif等語句一樣一條條搜索來算;效率極低);
而sql語句用的是集合運算;速度則快的多;如果用索引速度則很快(用了指針)
創建索引
a聚集索引:
聚集索引是磁盤存儲和邏輯顯示是一樣的
mssql表的主鍵一般是聚集索引;主鍵(每一條記錄唯一確定);
創建的主鍵自動會是聚集索引;
如有一個非常大的表(有百萬行);很長時間磁盤存儲上會有類似碎片(磁盤填充率效率低;一般是頻繁刪除造成的);
要提高它的性能的最簡潔辦法是:把這個表的主鍵去掉再保存後;然後重新設主鍵再保存;
(這個表就會在磁盤上重新整理排序;性能當然會提高喲)
b非聚集索引:
非聚集索引是在外面建立小的附加表(一種樹形結構;大多數是B或B+樹);
讀(遍歷select等sql語句)表特快;但寫(update;deleteinsert等sql語句)表性能會略微下降
針對數據量大的表建議非聚集索引不要超過個(節省額外磁盤負擔)
不要給類似性別列創建索引
死鎖:
是指有線程在讀一條記錄;別的線程讀這條記錄就要等待;
在mssql中只要長期占那條記錄的線程去掉;死鎖就會解除
在mssql中鎖是針對每一行記錄(所以性能不錯)
經常產生鎖的原因有:
a在sql語句中使用事務語句(特別是事務中當查詢比較耗時)
b在前台的應用程序的connetion沖突(未關閉)
c多表聯合查詢(尤其是在打開大的數據集時)
sql語句優化
ais null not or in不會用索引
b避免在索引列上使用計算或函數處理(索引會大失性能)還有%;有的甚至會全失索引性能
cSELECT中避免使用 * (寧可把需要字段列出來;而不要用*去把所有的字段都列出來)
d避免相關子查詢(select中套select)
ewhere的條件中=>exists>in(指性能)
forder by group by having distinct等語句要慎用(因為它們效率不高;它們是先把數據到臨時表中再進行處理的)
g聚集索引如有個字段組成(tt和tt);tt在前面;where的條件中如只用tt字段來判斷;就會用到一半的聚集索引;
where的條件中如tt和tt字段都用來判斷了;就會全用到聚集索引;
where的條件中如只用tt字段來判斷;就會用不到聚集索引了;
盡量不要使用TEXT數據類型
除非你使用TEXT處理一個很大的數據否則不要使用它因為它不易於查詢速度慢用的不好還會浪費大量的空間
一般的VARCHAR可以更好的處理你的數據
盡量不要使用臨時表
盡量不要使用臨時表除非你必須這樣做一般使用子查詢可以代替臨時表使用臨時表會帶來系統開銷
如果前台的代碼你是使用數據庫連接池而臨時表卻自始至終都存在SQL Server提供了一些替代方案比如Table數據類型
盡量少使用外鍵和觸發器
因為在mssql中這些功能的性能做得不是很好;隨便動一下表(它就會到相關的表去搞判斷;有很多情況並不需要);在後台消耗資源大
寧可在前台多寫些相關表的操作的代碼
From:http://tw.wingwit.com/Article/program/Oracle/201311/16744.html