[轉貼] 提升SQL查詢效率和避免LOCK發生 - SQL Server

 

出處:http://www.wretch.cc/blog/wthomasu/2476699

要提升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%

小弟試的結果…是有快了點,但是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

留言

這個網誌中的熱門文章

TeknoParrot 模擬器介紹,俗稱《鸚鵡模擬器》

[轉貼] ASP.NET傳遞參數給Crystal Report做Export或Print的動作

[轉貼] Server 端Post資料到 .ashx