Sql-Server
我們可以減少索引上的行鎖爭用嗎
我們很少有查詢每 5 秒檢查一次它們的狀態並更新它們的狀態。
下面是查詢的樣子(所有表列都在更新查詢中)
update table1 set Name='somename' DetailMessage='Error' LastUpdate=getdate() where id=14
最近這個表遇到了阻塞問題,上面的更新查詢是導致阻塞的。當我執行
Sp_Blitzindex
時,它顯示沒有失去索引,bur row lock contention of 284 minutes..以下是我到目前為止所做的幾個步驟..
1.確保外鍵被索引(它們也是主鍵)
2.為可以從新索引中受益的 select 語句創建索引,從而減少該索引上的鎖爭用
3.我還將 Fillfactor 減少到 10,之前每個頁面用於儲存 93 行,現在它每頁僅儲存 7 行(仍然無法給自己一個 100% 合乎邏輯的解釋,說明此更改將如何幫助……)
任何進一步的建議..如果您需要更多詳細資訊,請告訴我
下面是表的架構(更改了列名),表只有 350 行,查詢以每 5 秒 20/30 次查詢的頻率更新此表…
create table dbo.table1 ( [ID] [int] NOT NULL, [Name] [varchar](500) NULL, [DetailMessage] [nvarchar](max) NOT NULL , [LastUpdate] [datetime] NOT NULL )
**PS:**這是第三方查詢,我們無法通過更改隔離級別等更改來修改源數據庫…我只能添加索引
SQl 版本:SQl 2012
如果此第三方應用程序持有這些行鎖的時間足以導致爭用,並且
- 你無法改變這種行為,
- 並且阻塞的查詢是讀取查詢,然後
一種選擇是在該數據庫中啟用 Read Committed Snapshot Isolation:
ALTER DATABASE [YourDatabaseName] SET READ_COMMITTED_SNAPSHOT ON;
這應該會阻止這些
UPDATE
查詢阻塞您的讀取查詢。請注意,這將影響讀取查詢的結果,因為它們將看到正在讀取的數據的時間點快照,而不是被阻止等待更新。它還會增加 tempdb 的負載。有關實施 RCSI 的詳細處理,請在此處查看 Kendra Little 的文章: