アーカイブ目的でデータベースをデフラグ/圧縮する最良の方法


9

電子メールのアーカイブに使用されるSQL Serverインスタンスがあります(サードパーティのアーカイブパッケージによる)。多くの場合、ソフトウェアは新しい空のデータベースにロールオーバーされます。これまでは四半期ごとに行ってきましたが、今は毎月行う予定です。アーカイブされるデータの量は1か月あたり約15〜20 GBで、データの大部分は少数のテーブル(通常は2〜4)にのみ存在します。

新しいデータベースにロールオーバーすると、古いデータベースは完全に読み取り専用で使用されます。私がしたいことは、すべてのテーブル/インデックスが隣接しており、非常に高いFILL FACTORを持ち、データファイルの最後に多くの空スペースがない、タイトなデータファイルに最適化することです。また、このサーバーではStandard Editionを使用していますが、暗黙の制限がすべてあります(それ以外の場合は、既にデータ圧縮を使用しています)。

私が考えることができるいくつかの可能性:

  1. REBUILD / REORGANIZEインデックス、DBCC SHRINKFILE(わかりました、これは賢明なオプションではありません。DBCCSHRINKFILEは触れたものから小便を断片化するためですが、完全を期すために含めています。)
  2. 自動統計をオフにして新しいデータベースを作成します。ソースデータベースからすべてのテーブルをスクリプト化して再作成します。bcpを使用して、データをクラスターキーの順序で新しいデータベースにエクスポート/インポートします。すべてのインデックスをスクリプト化して再作成します。フルスキャンですべての統計を再計算します。
  3. 自動統計をオフにして新しいデータベースを作成します。ソースデータベースからすべてのテーブルをスクリプト化して再作成します。SSISまたはT-SQLを使用して、新しいデータベースにデータを転送します。すべてのインデックスをスクリプト化して再作成します。フルスキャンですべての統計を再計算します。

いずれの場合も、最後の手順はデータベースを読み取り専用モードに設定することです。

これを行うには他にどのような良い/良いオプションがありますか?私の懸念は、高いFILL FACTORを維持するような方法で、論理的に連続した方法でデータを移動することです。

編集:

データの約75%がイメージ(LOB)列に格納されているようです。


3
あなた(またはアプリケーション)は、テーブルが物理的にそれ以外のファイルグループになるPRIMARYかどうかを気にしますか?
Jon Seigel 2013

@JonSeigelそうではないと思いますが、テンプレートデータベースを作成してすべてのデータを移動する手間を省くことができるので、実際にはそれはかなり良いアイデアです。
db2 2013

自分でコーディングしたソリューションのみを検討していますか、それともそれを支援するためにいくつかのアプリケーションを確認できますか?RedGateのSQL Storage Compressを使用して、ライブデータを圧縮できます。または、仮想復元を試行して、圧縮されたバックアップをオンラインのデータベースとして使用できるようにすることもできます(実際には、完全なスペースが必要ではありません)。これらはすべて、ライブデータとバックアップの圧縮に非常に優れた古いHyperbac Windowsファイルドライバーに基づいています。
マリアン

@Marianはおもしろそうですが、とりあえず、SQL Serverのネイティブ機能に固執したいと思います。ファイルに未使用のスペースを大量に残さずに、データベースを非常に効果的に最適化する必要があるだけです。手動でスクリプトを作成する代わりに作業を実行するサードパーティのツールであれば、それで問題ありません。
db2 2013

これは単なる考えですが、新しいファイルグループを作成し、ファイルを追加し、適切な拡張(たとえば500 MB)を設定してから、テーブルをその新しいファイルグループに再構築してください。次に、プライマリファイルをほとんど何にも縮小しません。システムテーブルの断片化を気にする必要はありません。
Nic

回答:


1

ファイルの物理的な断片化を解消するには、ドロップが存在するクラスター化インデックスを新しいファイルグループに移動します。それらはROになるため、更新によって引き起こされる挿入、ページ分割に必要なスペースがないため、それらすべてを100%フィルファクターにします。

これにより、エンタープライズに行くことを決定した場合に、段階的な復元を実行してデータベースを非常に迅速にオンラインにすることもできます。Enterpriseでは、列ストアインデックスに加えて、この読み取り専用データのクエリ時間を大幅に削減できます。これは、巨大なフィレットです。

必要に応じて、ファイルの最後のスペースを削除するために、断片化の深刻な問題なしに読み取り専用に切り替える前に、shrinkfileオプションを1回使用できます。

余談ですが、LOBSに最新のデータ型を使用していることを確認するだけです。つまり、ntextまたはtextの代わりにnvarchar(max)またはvarchar(max)、imageの代わりにvarbinary(max)?


残念ながらそれは主にテキストと画像を使用しています。これはサードパーティのアプリケーションなので、変更することはできません。
db2 2013年

@itはアプリケーションに対して透過的であり、SQLサーバーは8k未満の場合、情報を続けて格納します。ベンダーがサポートしていないと言った場合、なぜSQL Server 2005で非推奨になったデータ型をまだ使用しているのかを尋ねます。
DamagedGoods 2013年

アプリケーションが、データ型を変更した後に失敗するWRITETEXTのようなテキスト/イメージ固有のものを実行しないことを完全に確信することはできません。しかし、要点に戻ると、クラスター化インデックスを再作成しても、実際にはLOBデータは移動されないようです。
db2 2013年

これを行うことはできますが、GUIでデザイナーに移動し、プロパティを展開してから、「通常のデータスペース」だけでなくTEXTIMAGEファイルグループも作成する必要があります。これを変更すると、テーブルが再作成されるので注意してください。明らかにこれをスクリプト化して、可能であればメンテナンスウィンドウで実行することができます
DamagedGoods 2013

少なくとも、適切な再構築スクリプトを生成するのに役立つ方法かもしれません。
db2 2013

0

構造化されていないデータを格納するのにも画像データ型を使用していたサードパーティツールで同様の問題に直面し、filestreamを使用するように列を変換することで解決しました。アプリが期待どおりに機能することを確認するためにいくつかのテストを行う必要がありますが、これにより、効率的な方法でデータをアーカイブデータベースに移動する独自のアーカイブプロセスを作成できるようになります。


この場合、filestreamはうまくスケーリングしないと思います。17のデータベース全体で1,400万行以上があり、1日あたり約15,000のメッセージを獲得しています。メッセージ本文のかなりの部分が4 KB未満であるため、NTFSクラスターの無駄はおそらく残忍です(そして、ブロックサイズが64 KB未満の新しいディスクボリュームを追加した場合でも同様です)。
db2

その場合、データ型をnvarchar(max)などに変換し、TEXTIMAGE_ON句を使用してこれらのラージオブジェクトに別のファイルグループを指定できますか?これにより、データを行外に格納し、アーカイブを管理する独自のプロセスを作成できます。
リアムコンフリー2013

filestreamの使用は、実際には各LOBSの大きさに依存します。1レコードあたり1 MBを超えると考える必要があります。したがって、この場合はオプションではないことに同意します
DamagedGoods 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.