ページレベルのロックが無効になっているインデックスがありますが、そのインデックスのインデックスの断片化の問題があります。
インデックスを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'
私の質問は、ページレベルのロックがそのインデックスに対して無効になっている場合に、インデックスの断片化を減らす方法ですか?
あなたの質問への答えはいくつかの documentation に埋もれています:
MAX DOP> 1およびALLOW_PAGE_LOCKS = OFFオプションでの実行が許可されている場合、オンラインインデックスの再構築により断片化が増加する可能性があります。
この理由については、次のMSDNブログの投稿で詳しく説明されています。
仕組み:オンラインインデックスの再構築-断片化の増加を引き起こす可能性があります
インデックスのページロックが無効になっている状況で問題を解決するためのいくつかのオプションは次のとおりです。
MAXDOP 1
での再構築