最近、非常に大規模で乱雑なデータベースを継承したので、それをクリーンアップする必要があります。サイズをいくらか考えると、プライマリデータベースには現在、それぞれ約3億行の3つの大きなテーブルが含まれており、約225GBのストレージスペースを占めています。毎日500万行以上が追加されます。
重大なディスク領域不足のため(前任者は古いデータをアーカイブしたり、そのサイズを管理したりしませんでした)、最大のテーブルから約2億8千万行を削除せざるを得ませんでした。このプロセスの完了には25時間以上かかり、その間、顧客向けアプリケーションからデータベースを切り離す必要がありました。
選択と挿入には非常に長い時間がかかるため、ここでテーブルのインデックスを再作成する必要があります。ただし、データベースを無期限にオフラインにするだけでなく、インデックスの再作成に必要な時間を見積もることができる必要があります。テーブルのインデックスを再作成したことがないので、適切な参照ポイントはありません。
主テーブルには、クラスター化され、単調に増加する主キーと、一意でない非クラスター化キーも含まれます。インデックスの再作成に使用できる十分なディスク容量があります。
だから私の質問はこれです:これは私にどれくらいの時間がかかるのですか?インデックスの再作成時間を推定するための良い目安は何ですか?
所要時間を見積もる方法はありません。非常に多くの異なるものが影響を及ぼします。 PaulがCHECKDB の長さについて書いているのと同様に、非常によく似たことがインデックス作成などで機能します。最良の答えは、過去にどれくらいの時間がかかったかです。それを判断できない場合、次の最良のオプションは、おそらく同様の非本番環境で試すことですが、それでも必ずしも一致するとは限りません(つまり、同時実行の問題などは異なります)。
補足として、SQL 2005以降のONLINE INDEX OPERATIONSを調べたいと思うかもしれません... 2番目のハイパーリンクを追加することはできませんが、google "online index operations sql server"をクリックして、トップリンクをクリックします。
テーブル/インデックスがどのように断片化されているかを実際に確認しましたか?データベースに対して次のクエリを実行してみてください(クエリはSQL2005以降で実行されます)。このクエリはサーバーに影響を与えるため、静かな時間に実行する必要があります。
SELECT OBJECT_NAME(i.OBJECT_ID) AS TableName,
i.name AS IndexName,
indexstats.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') indexstats
INNER JOIN sys.indexes i ON i.OBJECT_ID = indexstats.OBJECT_ID
AND i.index_id = indexstats.index_id
最も断片化されているテーブル/インデックスを選択的に再インデックスできます。
最初にテーブルを再構築したら、定期的にインデックスをデフラグ/再構築するメンテナンスジョブを設定します。 @SQLFoolとして知られるミシェルアフォードには、このための優れたスクリプトセットがあります。
http://sqlfool.com/2009/06/index-defrag-script-v30/
デフラグと再構築のしきい値を設定します。オンラインで再構築できるインデックスを自動的に検出し、それを行うことで、稼働時間のメリットが得られます。
インデックス操作によってトランザクションログに大量のアクティビティがスローされる可能性があることに注意してください。これにより、データベースミラーリングとトランザクションログのバックアップが実際に遅くなる可能性があります。
データベース操作は、それを実行しているハードウェアに大きく依存します。
すでに大量の行をカットアウトしていると言うので、オフピーク時に実行しても問題はありません。
古いデータベースをクリーンアップして読み取り専用に設定しながら、レプリケーションをセットアップしてそのデータベースを顧客に提供し、必要なデータを引き続き顧客が取得できるようにすることができます。