(一)select
不要對(duì)字段進(jìn)行null判斷;
用函數(shù)charindex()和前面加通配符%的LIKE執(zhí)行效率一樣;
移除不必要的字段和表
union效率比or要高,除了or兩邊的查詢列是一樣的情況;
在所需要的最小數(shù)據(jù)集上操作,where條件設(shè)置好,不要區(qū)多余數(shù)據(jù)
字段提取要按照“需多少、提多少”的原則,避免“select ”
where或者order by/group by字段建立索引;
不要在where語(yǔ)句中使用非操作,如:NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等;
like只能使用‘a(chǎn)dmin2%’形式,不能使用‘%dmin22’;
or會(huì)引起全表掃描;
in的作用相當(dāng)于or;exists 和 in 的執(zhí)行效率是一樣的;
count()不比count(字段)慢
order by按聚集索引列排序效率最高
高效的TOP,sqlserver中的top是進(jìn)過(guò)優(yōu)化的,分頁(yè)使用top
移除你JOIN和WHERE子句中的計(jì)算操作、函數(shù)
在使用索引字段作為條件時(shí),如果該索引是復(fù)合索引,那么必須使用到該索引中的第一個(gè)字段
如果在 where 子句中使用參數(shù),也會(huì)導(dǎo)致全表掃描;select id from t where num=@num
(二)left join
左表的主鍵、外鍵都要做索引
網(wǎng)上資料說(shuō)left join后面where 條件只要有一個(gè)有返回值,則轉(zhuǎn)換成select * from t1,t2 where con1 and con2的形式,實(shí)測(cè)效率沒(méi)有任何提升
(三)union
union和or執(zhí)行結(jié)果一樣,但是,當(dāng)搜索條件中搜索字段不同時(shí),union效率比or要高;當(dāng)搜索條件中搜索字段一樣時(shí),效率一樣差。union默認(rèn)會(huì)去除重復(fù)記錄,union all會(huì)顯示全部記錄
(四)update
where建立索引
(五)delete
where建立索引
(六)in
in的作用相當(dāng)于or;exists 和 in 的執(zhí)行效率是一樣的;
(七)sum
sum函數(shù)注意溢出,可能需要使用sum(cast(id as bigint))轉(zhuǎn)換成8字節(jié)的bigint
(八)group by
建立索引
(九)order by
建立索引