現在夜通しDW DB(ETLプロセスを介してデータを格納)でインデックスメンテナンスを実行するt-sqlジョブを設定し、ビジネスの成長に応じてより頻繁に実行する必要があることを計画しています。
問題は、通常はETLプロセスからデータをロードするDW DBの効率的なインデックスメンテナンスを実現するために、どの考慮事項を採用する必要があるかです。
現在、私はMP Ola Hallengren)によって使用される を実装することを念頭に置いています
以下のT-SQLコード:
EXECUTE dbo.IndexOptimize
@Databases = 'StackOverflow2010',
@FragmentationLow = NULL,
@FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationLevel1 = 30,
@FragmentationLevel2 = 70,
@UpdateStatistics = 'ALL'
追加のコメントや提案がある場合は非常に高く評価されます
インデックスの断片化が心配されている場合(これは、ディスクから範囲スキャンを実行している場合にのみ問題になります)、ETLプロセス中に定期的にデータをロードしている場合、ETLプロセス中にインデックスが有効(および更新)になっていると想定しています。
データをロードするとき、データを挿入している間は常にインデックスを更新する必要がありますが、断片化してしまうため、再構築する必要があります。
データを読み込んで後で再構築するときにのみインデックスを維持することは、SQL Serverにとって無駄な作業です。
私が検討することを提案する1つのアプローチは次のとおりです
テーブルのすべてのインデックスを無効化および有効化/再構築するコードは次のようになります
ALTER INDEX ALL ON dbo.[Table Name] DISABLE
-- perform data load
ALTER INDEX ALL ON dbo.[Table Name] REBUILD