質問

シュリンクは悪魔であることを知っています。ページの順序を逆転させ、皮膚がん、データの断片化、地球温暖化に責任があります。リストは続きます...私は100 GBのデータベースを持っていて、50 GBのデータを削除していると言われています - 1つのテーブルではなく、データベースワイドレベルでの古いデータの一般的な剪定で、90%の90%をカバーしています。表 - これは、データベースを縮小するための適切なユースケースを構成していますか?

そうでない場合、データベースからこのような高い割合のデータを削除した後、家を掃除するための適切な手順は何ですか? 2つを考えることができます:インデックスの再構築と統計を更新します。ほかに何か?

役に立ちましたか?

解決

再編成とシュリンクは決して推奨されません。

アプリを取得できる場合、データベースがオフラインで提供されている場合、シュリンクの前にすべてのインデックスとプライマリ/外部キーの制約を削除することにより、プロセスをスピードアップしてインデックスフラグメンテーションを減らすことができます(これにより、移動するデータが少なくなります。データページは、現在存在しないインデックスページではなくシャッフルされ、プロセスを高速化します)その後、すべてのインデックスとキーを再現します。

シュリンク後にインデックスを再現することは、それらが大幅に断片化されるべきではないことを意味し、シュリンクの間にそれらを行ったことは、それらを再構築することを意味します。

別のオプションアプリケーションをオフラインにできる場合は、すべてのデータを同じ構造の新しいデータベースに移行することです。ビルドプロセスがしっかりしている場合は、現在のdbからそれを作成しない場合、その空白のdbをすばやく構築できるはずです(現在のdbのバックアップを復元し、テーブル内のすべてのコンテンツを切り捨て/削除し、完全な収縮を実行します)。

宛先のすべてのインデックスをドロップし、その後、これは多くのインデックスデータを変更すると、より効率的になる可能性があるため、後でそれらを再作成することをお勧めします(この場合、その100%)。コピープロセスをスピードアップするには、さまざまな物理ドライブの宛先データベースのデータファイルをソースに移動します(SSDを使用している場合を除き、ヘッドの動きを減らすことを気にする必要はありません)。完了したらソースの場所に。

また、宛先を新しいものとして作成する場合(ソースのコピーをブランクするのではなく)、現在のすべてのデータと数か月分の成長を含む初期サイズで作成する場合、データコピーは再び速くなります。プロセス全体で何度も新しいスペースを割り当てることはありません。

データを新鮮なデータベースに移行すると、シュリンク操作の意図したアクションが再現されるため、これはシュリンクを使用するよりも優れているかもしれませんが、断片化がはるかに少ない(これは再編成とシュリンクの意図しない結果です)。シュリンクは、単にファイルの端近くからブロックを取り、最初のスペースに近い最初のスペースに置き、関連データをまとめるために努力しません。

その後、使用されたページが少ない可能性が高いため、結果はより効率的になると思います。シュリンクは、使用されたページを使用するだけで、データを移動すると、特にテーブルのクラスター化されたキー/インデックス(テーブルに1つ)の順序で宛先に挿入され、他のインデックスを作成する場合、データを移動する可能性が高くなります。データがすべて移行した後。

もちろん、アプリをオフラインで撮影できない場合は、シュリンクを実行するだけで唯一のオプションなので 本当 それとともにスペースを取り戻す必要があります。データ、アクセスパターン、一般的な作業セットサイズ、サーバーのRAMの量などに応じて、追加の内部断片化は最終的にそれほど重要ではないかもしれません。

コピー操作の場合、SSISまたはベースT-SQLのいずれかも同様に機能します(SSISオプションの効率が低下する可能性がありますが、後でメンテナンスしやすい場合があります)。インデックスとともに最後にFK関係を作成すると、どちらの場合も「各テーブルに対してコピー」を実行できます。もちろん、1回限りの場合、シュリンク+の再編成もおそらく問題ないでしょうが、私は人々を怖がらせて定期的な縮小を決して考えないのが好きです! (私は人々が毎日それらをスケジュールすることを知っています)。

他のヒント

データベースは再び成長しますか?もしそうなら、あなたがシュリンク操作に入れようとしている努力は無駄になるでしょう。なぜなら、あなたがファイルサイズをダウンしてからさらにデータを追加すると、ファイルが再び成長する必要があるからです。トランザクションは、その成長が起こるのを待たなければなりません。最適下の自動成長設定や遅いドライブがある場合、この成長活動は非常に苦痛になります。

データベースを縮小した場合、Freed Up Disk Spaceを使用するのは何ですか?繰り返しますが、このデータベースが再び成長した場合に備えて、そのスペースを自由に保つだけなら、車輪を回しているだけです。

ファイルにこのすべての空きスペースを手に入れたので、インデックスがよりよく最適化されるように再構築することです(そして、それを行うための空きスペースがあるときにこれを行うのははるかに苦痛になります - 小さなクローゼットと大きな寝室でセーターを交換しようとすることを考えてください)。

したがって、これが大規模なクリーンアップ操作であり、あなたが実際に同じレベルのデータに再び上昇することはない場合を除き、私はそれをそのまま残して、最適化の他の領域に焦点を合わせます。

スペースが不足している場合、データが大きくなるとは思わない場合は縮小しますが、典型的な成長を可能にする適切な充填要因を使用してインデックスを再構築します。

最終目標が実際にバックアップサイズを縮小することである場合は、トランザクションログをクリアするための包括的なバックアップ戦略を実装し、DBをバックアップするときは、Compressオプションを使用してください。

通常、5GBが頻繁に成長すると予想されない限り、5GBの自動成長をお勧めしません。そうでなければ、断続的なパフォーマンスの問題が発生する可能性があります。データサイズはまず、たとえば1年に必要だと思われるものに設定する必要があり、テストしたサイズに自動成長を設定することは、動作性能に影響しません。見る SQL ServerのShrinkデータベースボタンをタッチしないでください! マイク・ウォルシュ。

縮小する前にインデックスを再構築すると、インデックスがひどくレイアウトされます。再構築してから縮小するのは良くありません。縮小すると、インデックスがスペースを回復するように陥ります。そのため、事前に再構築してから縮小することは無意味です。見る オートシュリンクを使用するタイミング トーマス・ラロック著。

縮小後にこれが再インネキシングするよりもうまく機能するかどうかはわかりませんが、別のオプションは、適切にサイズの新しいデータファイルを作成し、すべてのデータをそのように移動することです。その場合、実際のデータサイズが何であるかを知っているように、最初にリネックスを行います。 1つのキャッチは、これがプライマリデータファイルの最初のファイルである場合、空にすることができるとは思わないということです。それを縮小してから、その後データを戻すことができるはずです。そうすれば、ページの逆転が回避されます。ただし、とにかく大きな違いを生むべきではない固体状態に移動することを検討している場合。

このように戻って遅く。それでも、私たちはテスト環境でのシュリンクの使用を長い間熟考し、テストしてきました。トピックに従って、そこに それは シュリンクが実行可能なオプションである時間。しかし、それをいつ、どのように適用するかを知ることは、長期的と短期的に適切な実行に不可欠です。

私たちのシナリオでは、最近、圧縮、パーティション、アーカイブ、冗長データの古い古い削除など、大規模なDBに多数の変更を追加しました。その結果、プライマリデータファイルの使用された部分は、以前のものの半分未満に低下しました。しかし、その荷物をすべて持ち歩くことのポイントは何ですか?特に、Web周辺のいくつかの記事に反して、データファイルのサイズはバックアップ /復元期間と直接相関しています。それは、多くの記事が想定しているのとは異なり、実際のシナリオには、削除されたものだけよりも、特定のページに多くのデータをロードしているからです。

さらに重要なことに、これは縮小するための素晴らしいシナリオを開きます:

  1. データベース内にすべてのオブジェクトとそのファイルグループを見つけるスクリプトを作成し(オンラインで多くの例)、これを使用してドロップ条項を作成し、すべてのインデックスと制約の定義を作成します。
  2. 新しいファイルとFileGroupを作成し、デフォルトを作成します。
  3. すべてのクラスター化されていないインデックスをドロップします(注、一部のインデックスは制約になる可能性があります)。
  4. drop_existing = on(これは、多くの代替品と比較して、非常に高速で最小限のログ操作です)を使用して、新しいFileGroupにクラスター化されたインデックスを作成します。
  5. クラスター化されていないインデックスを再作成します。
  6. 最後に、古いデータファイル(通常はプライマリ)を縮小します。

このようにして、そこに残っているデータは、DBのシステムオブジェクト、統計、手順などがあります。シュリンクははるかに速く、はるかに高速でなければならず、メインデータオブジェクトのインデックスメンテナンスは、将来の断片化のリスクをきちんと作成し、最小限に抑えられます。

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top