2017-01-25 87 views
0

我有沒有主鍵的表。但它在4列上有非唯一聚集索引。在更新表中的一個非關鍵列時,我們看到這個索引是死鎖的一部分。 我們如何避免這種情況?創建包含5列的主鍵還是添加標識列更好?我們可能還需要創建非聚集索引,以便在刪除現有聚集索引後提高性能。如何避免死鎖中的非唯一聚簇索引

+1

有相當多的是我的腦海裏來(身份+非聚集索引,身份+非聚集索引與包括複合PK)的幾個解決方案。答案取決於你的要求和數據結構。他們唯一的共同點就是:你應該給PK表。您的問題無法用現有信息回答。 – Sefe

回答

1

死鎖分辨率的最佳資源(仍然是)在這裏:http://blogs.msdn.com/b/bartd/archive/2006/09/09/deadlock-troubleshooting_2c00_-part-1.aspx

點號4表示:

運行涉及通過數據庫引擎優化顧問 僵局查詢。在Management Studio查詢窗口中填入查詢,將 數據庫上下文更改爲正確的數據庫,右鍵單擊查詢文本並選擇「分析DTA中的查詢」。不要跳過這一步;我們所看到的死鎖問題的一半以上的一半是通過簡單地添加 適當的索引來解決的,以便其中一個查詢運行得更快,並且具有更小的鎖定佔用空間的 。如果DTA建議索引(它會說 「估計的改進:%」),創建它們並監視到 查看死鎖是否持續。您可以從操作下拉菜單中選擇「應用建議」 以立即創建索引,或者 將CREATE INDEX命令另存爲腳本,以在 維護時段內創建它們。請務必分別調整每個查詢。

我知道這並不「回答」的問題爲什麼必然,但它確實表明,添加索引可以改變的方式執行,使任一鎖定足跡較小或執行時間快,可顯著降低陷入僵局的可能性。

https://stackoverflow.com/a/10738827/7462678

+0

謝謝LS!我嘗試運行DTA,我選擇了導致死鎖的整個MERGE語句,但它在建議中沒有顯示任何內容。 –

+0

我創建了一個新的標識列,並創建了主鍵和聚集索引。將現有的聚集索引更改爲非聚集索引。現在鎖模式爲X的聚簇索引發生死鎖。我們如何避免這種情況? Web服務創建多個線程並調用具有導致死鎖的合併語句的SP。 –

+0

只有一種(簡單的)方法可以100%確定你無法通過此過程獲得死鎖,並且可能會向MERGE添加TABLOCKX提示,但這可能會對性能造成非常不利的影響。 但是,添加TABLOCK提示可能足以解決問題,而不會對性能造成太大影響。 最後,您還可以嘗試添加PAGLOCK,XLOCK或PAGLOCK和XLOCK。再說這可能會起作用,並且性能可能不會太糟糕。你必須嘗試看看。 –

相關問題