I used to see my senior developers use WITH (NOLOCK) when querying in SQL Server and wonder why they use. Now i explored it and found that it's useful to improve the performance in executing the query . However there is a disadvantage in using it. The disadvantage is that one may not be sure that they are getting the data which is currently being updated in the Table, ie, Without lock protection, you cannot be guaranteed that the data isn't changing during the time that the query is running. I referred this link and found it pretty useful.
要提升SQL的查詢效能,一般來說大家會以建立索引(index)為第一考慮。其實除了index的建立之外,當我們在下SQL Command時,在文法中加一段WITH (NOLOCK)可以改善線上大量查詢的環境中資料集被LOCK的現象藉此改善查詢的效能。
不過有一點千萬要注意的就是,WITH (NOLOCK)的SQL SELECT有可能會造成Dirty Read。
例如:
SELECT COUNT(UserID)
FROM EMPLOYEE WITH (NOLOCK)
JOIN WORKING_GROUP WITH (NOLOCK)
ON EMPLOYEE.UserID = WORKING_GROUP.UserID
因為SQL Server會執行對應的鎖定一致性檢查。 欲改善整體資料庫查詢的效能,請將WITH (NOLOCK)加在您的SELECT文法中Table名稱的後面,雖然(NOLOCK)也可以,但是微軟還是建議大家要加WITH。
除了簡單的SELECT之外,有JOIN的SELECT文法也是可以使用的。但是DELETE、INSERT、UPDATE這些需要transaction的指令就不行了…
有些檔案說,加了WITH (NOLOCK)的SQL查詢效率可以增加33%。
加了WITH (NOLOCK)即告訴SQL Server,我們的這段SELECT指令無需去考慮目前table的transaction lock狀態,因此效能上會有明顯的提升,而且資料庫系統的Lock現象會有明顯的減少(包含Dead Lock)。
有一點要特別注意,因為WITH (NOLOCK)不考慮目前table的transaction lock,因此當有某些資料正處於多個phase交易(例如跨多個table的transaction交易-->如提款系統),WITH (NOLOCK)會讓目前處理交易process的資料被忽略…
講白話一點,也就是說當使用NoLock時,它允許閱讀那些已經修改但是還沒有交易完成的資料。因此如果有需要考慮transaction交易資料的即時完整性時,使用WITH (NOLOCK)就要好好考慮一下。
如果不需考慮transaction,WITH (NOLOCK)或許是個好用的參考。
注1:WITH ( < table_hint > )
指定由查詢最佳化工具使用的表掃描、一或多個索引,
或由查詢最佳化工具利用此資料表以及為此語句使用鎖定模式。
注2:WITH (NOLOCK)相當於READ UNCOMMITTED
最後說下nolock和with(nolock)的幾個小區別: 1:SQL05中的同義字,只支援with(nolock); 2:with(nolock)的寫法非常容易再指定索引。 跨伺服器查詢語句時 不能用with (nolock) 只能用nolock 同一個伺服器查詢時 則with (nolock)和nolock都可以用 比如SQL code
select * from [IP].a.dbo.table1 with (nolock) 這樣會提示用錯誤select * from a.dbo.table1 with (nolock) 這樣就可以
I used to see my senior developers use WITH (NOLOCK) when querying in SQL Server and wonder why they use. Now i explored it and found that it's useful to improve the performance in executing the query . However there is a disadvantage in using it. The disadvantage is that one may not be sure that they are getting the data which is currently being updated in the Table, ie, Without lock protection, you cannot be guaranteed that the data isn't changing during the time that the query is running. I referred this link and found it pretty useful.
要提升SQL的查詢效能,一般來說大家會以建立索引(index)為第一考慮。其實除了index的建立之外,當我們在下SQL Command時,在文法中加一段WITH (NOLOCK)可以改善線上大量查詢的環境中資料集被LOCK的現象藉此改善查詢的效能。
不過有一點千萬要注意的就是,WITH (NOLOCK)的SQL SELECT有可能會造成Dirty Read。
例如:
SELECT COUNT(UserID)
FROM EMPLOYEE WITH (NOLOCK)
JOIN WORKING_GROUP WITH (NOLOCK)
ON EMPLOYEE.UserID = WORKING_GROUP.UserID
因為SQL Server會執行對應的鎖定一致性檢查。 欲改善整體資料庫查詢的效能,請將WITH (NOLOCK)加在您的SELECT文法中Table名稱的後面,雖然(NOLOCK)也可以,但是微軟還是建議大家要加WITH。
除了簡單的SELECT之外,有JOIN的SELECT文法也是可以使用的。但是DELETE、INSERT、UPDATE這些需要transaction的指令就不行了…
有些檔案說,加了WITH (NOLOCK)的SQL查詢效率可以增加33%。
加了WITH (NOLOCK)即告訴SQL Server,我們的這段SELECT指令無需去考慮目前table的transaction lock狀態,因此效能上會有明顯的提升,而且資料庫系統的Lock現象會有明顯的減少(包含Dead Lock)。
有一點要特別注意,因為WITH (NOLOCK)不考慮目前table的transaction lock,因此當有某些資料正處於多個phase交易(例如跨多個table的transaction交易-->如提款系統),WITH (NOLOCK)會讓目前處理交易process的資料被忽略…
講白話一點,也就是說當使用NoLock時,它允許閱讀那些已經修改但是還沒有交易完成的資料。因此如果有需要考慮transaction交易資料的即時完整性時,使用WITH (NOLOCK)就要好好考慮一下。
如果不需考慮transaction,WITH (NOLOCK)或許是個好用的參考。
注1:WITH ( < table_hint > )
指定由查詢最佳化工具使用的表掃描、一或多個索引,
或由查詢最佳化工具利用此資料表以及為此語句使用鎖定模式。
注2:WITH (NOLOCK)相當於READ UNCOMMITTED