SqlServer的with(nolock)的用法
本文導讀:要提升SQL的查詢效能,一般來說大家會以建立索引(index
)為第一考慮。其實除了index
的建立之外,當我們在下SQL Command
時,在語法中加一段WITH (NOLOCK)
可以改善線上大量查詢的環境中資料集被LOCK
的現象藉此改善查詢的效能。不過有一點千萬要注意的就是,WITH (NOLOCK)
的SQL SELECT
有可能會造成Dirty Read
。
with(nolock)
的介紹
大家在寫查詢時,為了效能,往往會在表後面加一個nolock
,或者是with(nolock)
,其目的就是查詢是不鎖定表,從而達到提高查詢速度的目的。
當同一時間有多個使用者訪問同一資源,併發使用者中如果有使用者對資源做了修改,此時就會對其它使用者產生某些不利的影響,例如:
1、髒讀
一個使用者對一個資源做了修改,此時另外一個使用者正好讀取了這條被修改的記錄,然後,第一個使用者放棄修改,資料回到修改之前,這兩個不同的結果就是髒讀。
2、不可重複讀
一個使用者的一個操作是一個事務,這個事務分兩次讀取同一條記錄,如果第一次讀取後,有另外使用者修改了這個資料,然後第二次讀取的資料正好是其它使用者修改的資料,這樣造成兩次讀取的記錄不同,如果事務中鎖定這條記錄就可以避免。
3、幻讀
指使用者讀取一批記錄的情況,使用者兩次查詢同一條件的一批記錄,第一次查詢後,有其它使用者對這批資料做了修改,方法可能是修改,刪除,新增,第二次查詢時,會發現第一次查詢的記錄條目有的不在第二次查詢結果中,或者是第二次查詢的條目不在第一次查詢的內容中。
NOLOCK
語句執行時不發出共享鎖,允許髒讀 ,等於 READ UNCOMMITTED
事務隔離級別 。nolock
確實在查詢時能提高速度,但它並不是沒有缺點的,起碼它會引起髒讀、只適用與select
查詢語句。 在一些不需要考慮髒讀的場合會用到,例如當使用者在論壇發廣告貼時刪除其所有發帖,這個查詢就不怕髒讀,全刪,或者漏一個正在發的都不是問題。
二、例項
SELECT COUNT(UserID)
FROM EMPLOYEE WITH (NOLOCK)
JOIN WORKING_GROUP WITH (NOLOCK)
ON EMPLOYEE.UserID = WORKING_GROUP.UserID
三、with(nolock)
的使用場景
1:資料量特別大的表,犧牲資料安全性來提升效能是可以考慮的;
2:允許出現髒讀現象的業務邏輯,反之一些資料完整性要求比較嚴格的場景就不合適了,像金融方面等。
3:資料不經常修改的表,這樣會省於鎖定表的時間來大大加快查詢速度。
4、當使用NoLock
時,它允許閱讀那些已經修改但是還沒有交易完成的資料。因此如果有需要考慮transaction
事務資料的實時完整性時,使用WITH (NOLOCK)
就要好好考慮一下。
四、nolock
和with(nolock)
的幾個小區別
1、SQL05
中的同義詞,只支援with(nolock)
;
2、with(nolock)
的寫法非常容易再指定索引。
3、跨伺服器查詢語句時不能用with (nolock)
只能用nolock
,同一個伺服器查詢時 則with(nolock)
和nolock
都可以用
相關文章
- SQLSERVER 的 nolock 到底是怎樣的無鎖?SQLServer
- sqlserver鎖表的六種語法及with nolock的說明SQLServer
- SQLserver With As 用法SQLServer
- SQLServer MERGE 用法SQLServer
- SQLserver-MySQL的區別和用法ServerMySql
- 簡單介紹SQLserver中的declare變數用法SQLServer變數
- [轉帖]SQL秘笈 : NOLOCK、ROWLOCK、UPDLOCK的使用!SQL
- SQL Server 中的 NOLOCK 到底是什麼意思?SQLServer
- EntityFramework優化:查詢WITH(NOLOCK)Framework優化
- mssql sqlserver update delete表別名用法簡介SQLServerdelete
- sqlserver的坑SQLServer
- mssql sqlserver 關鍵字 GROUPING用法簡介及說明SQLServer
- SQLServer的頁壓縮SQLServer
- SqlServer鎖的概述(zt)SQLServer
- SQLServer臨時表的使用SQLServer
- SQLSERVER的一些坑。SQLServer
- tie的用法
- volatile的用法
- using的用法
- SQL AS 的用法SQL
- confirm的用法
- SUBMIT 的用法MIT
- contentProvider的用法IDE
- openssl的用法
- indexOf()的用法Index
- Pythonyield的用法Python
- Promise的用法Promise
- errno的用法
- Qdrant用法;Qdrant在langchain裡的用法LangChain
- 檢視sqlserver的某程式的sql文字SQLServer
- SQLServer的常用資料型別SQLServer資料型別
- sqlserver關於always on的總結SQLServer
- Sqlserver 如何truncate linked server的表SQLServer
- SqlServer遊標的建立與使用SQLServer
- SQLServer使用case when中的order bySQLServer
- sqlserver dba常用的sql語句SQLServer
- Sqlserver中的儲存過程SQLServer儲存過程
- SQLSERVER 資料庫效能的基本SQLServer資料庫