1.只查詢(xún)有用的數(shù)據(jù)
橫向來(lái)看咏花,不要返回自己不需要的列,盡量不要使用select *;
縱向來(lái)看昏翰,不要返回自己不需要的行苍匆,盡量使用where條件來(lái)過(guò)濾自己需要的內(nèi)容;
考慮使用top棚菊;
考慮使用分頁(yè)浸踩;
對(duì)于聚合查詢(xún),可以用having子句進(jìn)行進(jìn)一步的過(guò)濾统求;
2.避免重復(fù)的SQL操作
避免同一SQL語(yǔ)句多次執(zhí)行检碗,業(yè)務(wù)上嚴(yán)格控制不必要的邏輯;
3.建議使用別名
多表鏈接,使用別名码邻,提高解析速度折剃,避免列名歧義引發(fā)的語(yǔ)法錯(cuò)誤;
即便不命名別名,SQLServer也會(huì)給它一個(gè)別名像屋,所以手動(dòng)顯示命名可以提高解析速度;
4.禁用隱式轉(zhuǎn)化
類(lèi)型匹配怕犁,特別是字符型和數(shù)值型;
varchar類(lèi)型和nvarchar類(lèi)型也是隱式轉(zhuǎn)化,容易忽略;
5.union all 優(yōu)于 union
列是相同的己莺,包括列的類(lèi)型奏甫、列的順序、列的數(shù)量;
區(qū)別:union是在union all的基礎(chǔ)上凌受,刪除重復(fù)的記錄;
如果允許重復(fù)的記錄或者查詢(xún)除的數(shù)據(jù)本身沒(méi)有重復(fù)記錄扶檐,請(qǐng)使用union all;
union有默認(rèn)排序;
UNION在進(jìn)行表鏈接后會(huì)篩選掉重復(fù)的記錄,所以在表鏈接后會(huì)對(duì)所產(chǎn)生的結(jié)果集進(jìn)行排序運(yùn)算胁艰,刪除重復(fù)的記錄再返回結(jié)果;
UNION ALL只是簡(jiǎn)單的將兩個(gè)結(jié)果合并后就返回;
6.Like操作符
明確左側(cè)內(nèi)容時(shí)款筑,左側(cè)不應(yīng)使用“%”通配;
左側(cè)使用“%”通配,不會(huì)執(zhí)行索引查找腾么,造成性能問(wèn)題;
7.避免對(duì)索引字段使用運(yùn)算或者函數(shù)表達(dá)式
8.批量執(zhí)行SQL
批量插入數(shù)據(jù)時(shí)奈梳,為了減少與數(shù)據(jù)庫(kù)交互測(cè)試,可以每句sql后面加";"解虱;
最前加"begin"攘须,最尾加"end";
9.空殴泰、空格于宙、null
‘’‘與’ '相同,與null不同悍汛;
’<>'是查詢(xún)不出null值的捞魁;
----------------------------------------分割線(xiàn)----------------------------
10.行轉(zhuǎn)列,列轉(zhuǎn)行
1)PIVOT函數(shù)离咐,行轉(zhuǎn)列
PIVOT(<聚合函數(shù)>([聚合列值])FOR[行轉(zhuǎn)列前的列名]IN([行轉(zhuǎn)列后的列名1],[行轉(zhuǎn)列后的列名2],[行轉(zhuǎn)列后的列名3],.......[行轉(zhuǎn)列后的列名N]))谱俭;
2)UNPIVOT函數(shù)奉件,列轉(zhuǎn)行
UNPIVOT([轉(zhuǎn)換為行的列值在轉(zhuǎn)換后對(duì)應(yīng)的列名]for[轉(zhuǎn)換為行的列名在轉(zhuǎn)換后對(duì)應(yīng)的列名]in([轉(zhuǎn)換為行的列1],[轉(zhuǎn)換為行的列2],[轉(zhuǎn)換為行的列3],...[轉(zhuǎn)換為行的列N]));
11.分頁(yè)?OFFSET?FETCH NEXT
ORDER BY a.TransDate DESC OFFSET $SkipCount$ ROWS FETCH NEXT $PageSize$ ROWS ONLY