web-dev-qa-db-ja.com

インデックスのページレベルのロックを無効にした後のインデックスの断片化の問題

ページレベルのロックが無効になっているインデックスがありますが、そのインデックスのインデックスの断片化の問題があります。

インデックスをReorganizeできないことは知っていましたが、インデックスをrebuildできると思いました。

今私はリビルドも機能していないと思います。私はデフォルトの100のFILLFACTORを使用しています。私のデータベースは巨大なので、80%以下のFILLFACTORを指定してテーブル/データベースのサイズを増やしたくありません。動作しないということは、前夜のOlaのスクリプトを実行した後もAvg Fragmentationは同じままであることを意味します。

ページレベルのロックが無効になっている理由の背景

その特定のテーブルのこのインデックスで大量のトランザクションdeadlocksを取得していました。このテーブルは、insert, update and deleteが常に発生するファクトテーブルのようなものでした。また、foreign keyを使用する他のいくつかのテーブルとのCASCADE deletes関係もいくつかあります。そのため、多くのロック/デッドロックを取得しており、ページレベルのロックを無効にした後、それらのデッドロックをすべて取り除くことができました。

私はIndex maintenanceにOla Hallengrenのスクリプトを使い始め、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'

私の質問は、ページレベルのロックがそのインデックスに対して無効になっている場合に、インデックスの断片化を減らす方法ですか?

7
user9516827

あなたの質問への答えはいくつかの documentation に埋もれています:

MAX DOP> 1およびALLOW_PAGE_LOCKS = OFFオプションでの実行が許可されている場合、オンラインインデックスの再構築により断片化が増加する可能性があります。

この理由については、次のMSDNブログの投稿で詳しく説明されています。

仕組み:オンラインインデックスの再構築-断片化の増加を引き起こす可能性があります

インデックスのページロックが無効になっている状況で問題を解決するためのいくつかのオプションは次のとおりです。

  • オフラインで再構築
  • MAXDOP 1での再構築
13
Josh Darnell