隨資料增長,查詢速度下降。建立索引是首選,但語法層面加上 WITH (NOLOCK) 可立即改善線上高併發環境下的鎖定爭用,顯著提升查詢吞吐量。
SQL Server 採用混合鎖策略:起始用列鎖,隨修改行數增加升級為頁面鎖、表鎖。兩用戶以相反順序修改邏輯無關但物理相鄰的記錄,易觸發死鎖:
資料庫透過死鎖偵測犧牲修改量較小的交易,但頻繁死鎖嚴重影響系統穩定性。
SELECT COUNT(UserID) FROM Users WITH (NOLOCK) WHERE Username LIKE 'football%';
UPDATE Users WITH (ROWLOCK) SET Username = 'admin' WHERE Username = 'football';
SELECT、UPDATE、DELETEUPDATE/DELETE 且有明確主鍵條件時使用無 NOLOCK:34,720 ms

加上 WITH (NOLOCK):2,563 ms

效能提升約 13.5 倍(實際倍數視鎖爭用嚴重度而定)。
| 寫法 | 適用版本 | 指定索引 | 跨伺服器查詢 |
|---|---|---|---|
WITH (NOLOCK) | SQL 2005+ | 容易搭配 INDEX() | 不支援,報錯 |
NOLOCK (無 WITH) | 所有版本 | 較麻煩 | 支援 |
跨伺服器範例:
-- 錯誤
SELECT * FROM [LinkedServer].db.dbo.table WITH (NOLOCK);
-- 正確
SELECT * FROM [LinkedServer].db.dbo.table NOLOCK;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 效果等同全查詢 NOLOCK