2013-03-08 68 views
1

任何人都可以提出一個很好的理由在SELECT語句上發出一個NOLOCK?在SELECT語句中使用NOLOCK的目的是什麼?

我重新考慮了一些散佈在它們上面的存儲過程,我的理解是SELECT語句上的NOLOCK幾乎沒用。

+0

請參閱http://stackoverflow.com/questions/210171/effect-of-nolock-hint-in-select-statements – Tass 2013-03-08 23:03:28

+0

包含SQL提供程序/版本作爲標記。 – 2013-03-08 23:08:36

回答

4

因此,SELECT不會被併發數據修改查詢阻止。

有些人認爲這是一個神奇的快速按鈕,並應用它自由。除非你的用例正在接受讀取在讀取之後可能回滾的骯髒(未提交)數據的可能性(並且因此從未邏輯上存在)以及某種類型異常的可能性更大,否則它可能比無用更糟。

與讀取提交的隔離級別nolock相比,您的掃描缺失數據的概率會更大,讀取兩次或完全失敗並出現數據移動錯誤。

2

NOLOCK相當於事務上的READ-UNCOMMITTED。

簡而言之,使用NOLOCK可確保您的SELECT語句速度快,因爲它不必等待現有的鎖或事務完成,然後再返回查詢結果。不利的一面是,你最終可能會退回「髒」的數據 - 在提交之前但在你的SELECT語句運行之後可能已經回滾的東西。

其他信息可在Using NOLOCK and READPAST table hints in SQL Server找到。

+0

馬丁,你說的對。答案已更新。 – eSamuel 2013-03-08 23:16:13

+0

對不起,1。不要將NOLOCK提升爲確保快速查詢,因爲它不適用於所有情況,只能在NOLOCK是您必須使用的唯一解決方案的情況下使用。 – 2013-03-08 23:50:47

0

如果您從內容很少更改的查找表中讀取,則NoLocks特別有用。

nolock的問題當然是,如果表正在更新,你可能會得到不好的數據。有些情況下,可以正確使用nolock的表不斷更新。舉例來說,你有表:

UserConfig的 {ID INT PRIMARY KEY, is_active_flag位, allow_x_feature位, allow_y_feature位 }

如果您正在運行的ID選擇查詢和過濾,然後你即使此表經常更新也要使用nolock。

+0

如果表沒有被更新,那麼SQL Server可以避免對它進行共享行鎖,所以不知道這實際上會有多少好處。 (參考:[缺少共享鎖的情況](http://sqlblog.com/blogs/paul_white/archive/2010/11/01/read-committed-shared-locks-and-rollbacks.aspx))它可能最好將這些不變的數據放在只讀文件組中。 – 2013-03-08 23:18:05

4

我看到一些不好的信息已經飛來飛去了。 WITH(NOLOCK)選擇不是一款性能工具,無論您需要什麼速度,都可以使用。閱讀這article它傾倒在eSamuel提供的答案,因爲這是大多數人認爲,你可以看到的票數。那些不知道但反覆聽到他們所聽到的應該怎麼做的人。學會先優化您的數據和查詢。 NOLOCK提示只應用於您一直處理記錄處於死鎖狀態的系統或NOLOCK提供解決方案的另一個問題。

我在開發一個OLTP系統的金融機構工作,該系統每分鐘處理大量交易併爲客戶和客戶提供實時報告功能。這些人整天都在讀取我們的新數據,如果我們不使用NOLOCK進行報告查詢,發生死鎖只是時間問題。

在跳到NOLOCK之前,請做好您的盡職調查並閱讀有信譽的專業人士的資料,因爲還有更多內容。

相關問題