禁用索引的页面级锁定后的索引碎片问题

use*_*827 7 sql-server fragmentation ola-hallengren index-maintenance

我有一个禁用了页面级锁定的索引,现在我有该索引的索引碎片问题。

我知道我将无法Reorganize建立索引,但我相信我能够建立rebuild索引。

现在我认为重建也不起作用。我使用的默认填充因子为 100。我的数据库很大,所以我不希望通过将填充因子设置为 80% 或更少来增加表/数据库的大小。不工作是指在前一天晚上运行 Ola 的脚本后,平均碎片保持不变。

关于为什么禁用页面级锁定的一点背景。

deadlocks在那个特定表中的这个索引上得到了很多交易。这张表是一种insert, update and delete每时每刻都在发生的事实表。并且与foreign key其他几个表有一些关系CASCADE deletes。所以,我遇到了很多锁/死锁,在禁用页面级锁之后,我能够摆脱所有这些死锁。

我开始使用 Ola Hallengren 的脚本,Index maintenance并对所有索引重组不起作用的索引应用了索引重建。但我注意到索引重建也不起作用。

现在,我看到索引的 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'
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果为该索引禁用了页面级锁,如何减少索引中的碎片?

Jos*_*ell 14

您查询的答案隐藏在一些文档中

当允许使用 MAX DOP > 1 和 ALLOW_PAGE_LOCKS = OFF 选项运行时,联机索引重建可能会增加碎片。

其原因在以下 MSDN 博客文章中详细解释:

工作原理:在线索引重建 - 可能导致碎片化增加

在您的情况下,为索引禁用页面锁定的一些解决问题的选项是:

  • 离线重建
  • 重建于 MAXDOP 1