一、WITH(NOLOCK)
1汽馋、使用WITH(NOLOCK)時查詢不受其它排他鎖阻塞
2千元、WITH(NOLOCK) 不發(fā)布共享鎖來阻止其他事務(wù)修改當(dāng)前事務(wù)讀取的數(shù)據(jù)
使用場景
1: 基礎(chǔ)數(shù)據(jù)表颤芬,這些表的數(shù)據(jù)很少變更逃延。
2:歷史數(shù)據(jù)表,這些表的數(shù)據(jù)很少變更簿盅。
3:業(yè)務(wù)允許臟讀情況出現(xiàn)涉及的表挥下。
4:數(shù)據(jù)量超大的表,出于性能考慮桨醋,而允許臟讀棚瘟。
二、批量操作
方法一:使用子查詢
使用IN 或 exists關(guān)鍵字
in是把外表和內(nèi)表作hash 連接喜最,而exists 是對外表作循環(huán)偎蘸,每次循環(huán)再對內(nèi)表進行查詢。
一直以來認為exists 比in 效率高的說法是不準(zhǔn)確的。如果查詢的兩個表大小相當(dāng)迷雪,那么用in 和exists 差別不大限书。
如果兩個表中一個較小,一個是大表章咧,則子查詢表大的用exists蔗包,子查詢表小的用in
NOT IN 或 NOT EXISTS
如果查詢語句使用了not in 那么內(nèi)外表都進行全表掃描,沒有用到索引慧邮;
而not extsts 的子查詢依然能用到表上的索引。所以無論那個表大舟陆,用not exists 都比not in 要快误澳。
方法二:使用JOIN關(guān)聯(lián)表
如果直接對多個數(shù)據(jù)庫表進行join,數(shù)據(jù)量很大時秦躯,效率很低
解決方案:采用臨時表
CREATE TABLE #tmp
(
ID INT IDENTITY(1,1) PRIMARY KEY,
ItemNumber CHAR(25),
CountryCode CHAR(3)
)
將需要處理的數(shù)據(jù)關(guān)鍵信息存入臨時表忆谓,使用臨時表進行join,大大提升性能
三踱承、循環(huán)操作
游標(biāo)CURSOR
DECLARE Template_Cursor CURSOR
FOR
SELECT LastName, FirstName FROM Northwind.dbo.Employees
OPEN Template_Cursor
FETCH NEXT FROM Template_Cursor
INTO @LastName, @FirstName
WHILE @@FETCH_STATUS = 0
BEGIN
.....
FETCH NEXT FROM Template_Cursor
END
CLOSE Template_Cursor
DEALLOCATE Template_Cursor
@@fetch_status
@@fetch_status是MicroSoft SQL SERVER的一個全局變量
其值有以下三種倡缠,分別表示三種不同含義:【返回類型integer】
0 FETCH 語句成功
-1 FETCH 語句失敗或此行不在結(jié)果集中
-2 被提取的行不存在
@@fetch_status值的改變是通過fetch next from實現(xiàn)的
“FETCH NEXT FROM Cursor”
四、類型轉(zhuǎn)換
將int類型轉(zhuǎn)化為char
select CAST(20201015 AS CHAR(10))
將int類型轉(zhuǎn)化為char再轉(zhuǎn)化為date
select CAST(CAST(20201015 AS CHAR(10)) AS DATE)
對datetime進行計算以后轉(zhuǎn)為date類型
SELECT CAST(DATEADD(DAY, -180, GETDATE()) as DATE)
對日期進行運算以后截取為char茎活,再轉(zhuǎn)為int類型
DECLARE @start_date INT = CONVERT(INT,CONVERT(CHAR(10), DATEADD(d, -180, GETDATE()), 112))