2011-03-21 116 views
1

我見過開發人員在查詢中使用WITH(nolock),是否有任何缺點? 另外,查詢的默認執行模式是什麼?我的數據庫沒有任何索引。使用WITH(NOLOCK)提高性能

有沒有其他方法可以提高數據庫選擇語句的性能?

+1

那麼,我會開始添加索引來提高性能。你可以得到一個巨大的表演。利用索引獲得收益 – 2011-03-21 10:18:12

+0

可能的重複[SQL - 何時應該使用「with(nolock)」](http://stackoverflow.com/questions/686724/sql-when-should-you-use-with-nolock) – 2011-03-21 10:27:08

回答

2

nolock常見的誤解是它在執行時不會鎖定數據庫。從技術上講,它會發出模式穩定性(sch-s)鎖,所以鎖的「否」部分與查詢的數據端相關。

大多數情況下,我看到這一點,開發人員提前做出優化是因爲他們聽說它使查詢更快。

除非您在接受髒讀(並可能讀取同一行兩次)中安裝證明和有效性,否則不應該使用它 - 它肯定不應該是查詢的默認方法,而是規則的一個例外可以證明它是必需的。

2

網上有很多關於此的文章。主要風險在於NOLOCK可以從表中讀取未經處理的數據(髒讀)。例如,請參閱http://msdn.microsoft.com/en-us/library/aa259216(v=sql.80).aspxhttp://www.techrepublic.com/article/using-nolock-and-readpast-table-hints-in-sql-server/6185492

+0

指向msdn的鏈接文章壞了。新的鏈接將是https://docs.microsoft.com/en-us/sql/t-sql/statements/set-transaction-isolation-level-transact-sql – 2017-11-24 03:15:31

0

NOLOCK在從常用表格中讀取舊數據時非常有用。考慮下面的例子,

您有一個存儲過程來訪問非活動項目的數據。您 不希望此存儲過程在讀取舊數據時鎖定經常使用的項目表 表。

NOLOCK時也很有髒讀不是一個問題,數據不被頻繁修改,如在下列情況下,國家,貨幣等

閱讀列表...從數據庫在窗體中顯示 。這裏的數據保持不變,髒讀將不會造成大問題,因爲它很少會發生。