SqlServer的with(nolock)的用法

風靈使發表於2019-04-07

本文導讀:要提升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)就要好好考慮一下。

四、nolockwith(nolock)的幾個小區別

1、SQL05中的同義詞,只支援with(nolock);

2、with(nolock)的寫法非常容易再指定索引。

3、跨伺服器查詢語句時不能用with (nolock) 只能用nolock,同一個伺服器查詢時 則with(nolock)nolock都可以用

相關文章