Sql-Server

禁用索引的頁面級鎖定後的索引碎片問題

  • August 6, 2019

我有一個禁用頁面級鎖定的索引,現在我有該索引的索引碎片問題。

我知道我不能Reorganize索引,但我相信我能rebuild索引。

現在我認為重建也不起作用。我使用的預設填充因子為 100。我的數據庫很大,因此我不希望通過提供 80% 或更少的填充因子來增加表/數據庫的大小。通過不工作,我的意思是平均碎片在前一天晚上執行 Ola 的腳本後保持不變。

關於為什麼禁用頁面級鎖定的一些背景知識。

deadlocks我在那個特定表中的這個索引上得到了很多交易。這張表有點像一個事實表,insert, update and delete每時每刻都在發生。並且與其他一些表有一些foreign key關係CASCADE deletes。所以,我得到了很多鎖/死鎖,在禁用頁面級鎖之後,我能夠擺脫所有這些死鎖。

我開始使用 Ola Hallengren 的腳本,Index maintenance並對 Index Reorganize 不起作用的所有索引應用 Index Rebuild。但我注意到索引重建也不起作用。

現在,我看到索引的 AvgPageFragmentaiton 為 95.9413,頁數為 1196826,這並不好。

附加資訊:

我正在使用 Ola Hall 的腳本,如下所示。

EXECUTE dbo.IndexOptimize
   @Databases = 'DB_NAME',
   @FragmentationLow = NULL,
   @FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE',
   @FragmentationHigh = ''INDEX_REORGANIZE,INDEX_REBUILD_ONLINE'',
   @FragmentationLevel1 = 5,
   @FragmentationLevel2 = 30,
   @SortInTempdb = 'Y',
   @MaxDOP = 0,
   @WaitAtLowPriorityMaxDuration = 0,
   @WaitAtLowPriorityAbortAfterWait= 'NONE',
   @Indexes = 'DB_NAME.[dbo].TB1,DB_NAME.[dbo].TB2'

我的問題是,如果為該索引禁用了頁面級鎖定,如何減少索引中的碎片?

您的查詢的答案隱藏在一些文件中:

當允許使用 MAX DOP > 1 和 ALLOW_PAGE_LOCKS = OFF 選項執行時,聯機索引重建可能會增加碎片。

其原因在以下 MSDN 博文中有詳細說明:

工作原理:線上索引重建——可能導致碎片增加

在您的情況下,為索引禁用頁面鎖定的一些解決問題的選項是:

  • 離線重建
  • 重建於MAXDOP 1

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