2009-11-09 40 views
110

在SQL Server 2008中更改表(刪除列)時,我單擊了「生成更改腳本」按鈕,我注意到它生成的更改腳本將該列刪除,並顯示「go」,然後運行附加的ALTER TABLE語句將表格的鎖定升級設置爲「TABLE」。示例:鎖定升級 - 這裏發生了什麼?

ALTER TABLE dbo.Contract SET (LOCK_ESCALATION = TABLE) 

我還應該注意,這是變更腳本正在做的最後一件事。這裏做了什麼,爲什麼將LOCK_ESCALATION設置爲TABLE?

回答

141

Lock Escalation」是SQL如何處理大型更新的鎖定。當SQL要改變很多行時,對於數據庫引擎來說,更少的更大的鎖(例如整個表)而不是鎖定許多較小的事物(例如行鎖)會更高效。

但是,當您有一個巨大的表時,這可能會產生問題,因爲對整個表進行鎖定可能會長時間鎖定其他查詢。這是一個折衷:許多小粒度鎖比粗粒度鎖少一些(或一個),並且有多個查詢鎖定表的不同部分會在一個進程正在等待另一個進程時造成死鎖的可能性。

在SQL 2008中有一個表級選項LOCK_ESCALATION,它允許控制鎖升級。默認的「TABLE」允許鎖升級到表級。在大多數情況下,DISABLE可防止鎖升級到整個表。除非表被分區,否則AUTO允許表鎖,在這種情況下,鎖僅由分區級構成。有關更多信息,請參見this blog post

我懷疑,因爲表是在2008年的SQL注意默認是LOCK_ESCALATION沒有SQL 2005中支持的IDE增加時重新創建表此設置,所以你需要剝去它,如果試圖運行2005年實例上的腳本。另外,由於TABLE是默認值,因此在重新運行腳本時可以安全地刪除該行。

還要注意的是,在2005年之前,SQL此設置存在,所有的鎖會升級到換句話說表level--,「TABLE」是在SQL中唯一設置2005

+1

在MSDN論壇上重複的職位,以及:http://social.msdn.microsoft.com/Forums/en-US/sqldatabaseengine/thread/e96aa19e-d72c-46af-b2e8-4bf54de09440 – 2009-11-09 21:13:00

+0

@JustinGrant:可以這樣表達與「CREATE TABLE」語句結合使用? – 2013-03-28 14:16:38

+6

@dma_k - 此選項與「CREATE TABLE」無關,因爲該表尚不存在,所以沒有什麼可以鎖定。 – 2013-03-29 17:46:24

6

可以檢查你需要通過前相比這個值和運行腳本的主體部分後,包括腳本中LOCK_ESCALATION聲明:

SELECT lock_escalation_desc FROM sys.tables WHERE name='yourtablename' 

在我的情況下,改變table刪除或添加約束似乎沒有修改這個值。

相關問題