web-dev-qa-db-ja.com

DW-DB(ETLプロセス)のインデックスメンテナンス

現在夜通し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'

追加のコメントや提案がある場合は非常に高く評価されます

2
giantLincecum

インデックスの断片化が心配されている場合(これは、ディスクから範囲スキャンを実行している場合にのみ問題になります)、ETLプロセス中に定期的にデータをロードしている場合、ETLプロセス中にインデックスが有効(および更新)になっていると想定しています。

データをロードするとき、データを挿入している間は常にインデックスを更新する必要がありますが、断片化してしまうため、再構築する必要があります。

データを読み込んで後で再構築するときにのみインデックスを維持することは、SQL Serverにとって無駄な作業です。

私が検討することを提案する1つのアプローチは次のとおりです

  • テーブルにデータを読み込む前に、テーブルのすべての非クラスター化インデックスを無効にする
  • クラスター化キーがある場合は、クラスター化されたキーの順序でデータを読み込みます(ほとんどのデータウェアハウスは、とにかく代理キーを使用します)
  • データをロードした後、インデックスを再度有効にします。これにより、データのロード後にインデックスが1回だけ作成され、連続します。

テーブルのすべてのインデックスを無効化および有効化/再構築するコードは次のようになります

ALTER INDEX ALL ON dbo.[Table Name] DISABLE

-- perform data load

ALTER INDEX ALL ON dbo.[Table Name] REBUILD