Sql-Server

我們可以減少索引上的行鎖爭用嗎

  • July 1, 2020

我們很少有查詢每 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 的文章:

在 SQL Server 中實現快照或讀取送出的快照隔離:指南

引用自:https://dba.stackexchange.com/questions/269889