web-dev-qa-db-ja.com

dbccクリーン可能バッチサイズの説明

5億行の非常に大きなテーブルと、ドロップするテキスト列があります。私の開発環境では、列を削除して再利用プロセスを開始しましたが、「DBCC CLEANTABLE(MyDb、 'dbo.LargeTbl、100000)」ステートメントのバッチサイズが実際にどうなるかわかりません。

最初の5行をチェックして終了することを期待して、5に設定してみました。 「DBCC CLEANTABLE(MyDb、 'dbo.LargeTbl、5)」で、28時間かかりました。だから私はdbを復元し、100,000に設定し、4時間かかりました

実際の質問:バッチサイズは、一度に実行する行数をdbccクリーンテーブルに指示し、500milのすべての行を通過するまで、一度に100Kを実行し続けますか?または、100,000を実行したら、500ミルの行をすべて実行するまで、もう一度実行する必要がありますか?

2回目のテスト(100Kを1回実行)では、30GBを再利用できました。次に、すべてのインデックスに対してインデックス再編成を実行し、再利用してさらに60GBを再利用しました。

5
Tomasz

Microsoftドキュメント によると、バッチサイズは、トランザクションごとに処理する行数をDBCC CleanTableに通知します。これは、DBCC CleanTableプロセスの実行時にDBCC CleanTableが内部で処理する行数に関連しています。

ドキュメントの例を取り、100万行を追加するように変更してから、バッチサイズの値を変えてサンプルスクリプトを複数回実行すると(以下を参照)、小さいバッチサイズを指定すると、DBCC CleanTableが動作しているだけなので実行時間が長くなるようですバッチサイズで指定された行数。

  • バッチサイズが指定されていません
  • バッチサイズ5
  • 100,00のバッチサイズ
3
armitage

すばらしい answer by armitage に加えて、シナリオでDBCC CLEANTABLEを使用する必要はおそらくないでしょう。

あなたが述べる

次に、すべてのインデックスに対してインデックスreorgを実行し、再利用してさらに60GBを再利用しました。

Microsoftドキュメント のベストプラクティスは次のように述べています。

DBCC CLEANTABLEは、定期的なメンテナンスタスクとして実行しないでください。代わりに、テーブルまたはインデックス付きビューの可変長列に大きな変更を加えた後、DBCC CLEANTABLEを使用して、未使用の領域をすぐに再利用する必要があります。あるいは、テーブルまたはビューのインデックスをrebuildできます。ただし、これを行うと、リソースを集中的に使用する操作になります。

時間と空間があなたの最大の目標のようです。一般に、インデックスの再構築は、再編成よりも高速です(しかし、より多くのリソースを消費します)。

Developmentサーバーで作業しているとき。

インデックスを再構築するだけで、インデックスの再編成とDBCC CLEANTABLEのメリットが同時に得られます。

RebuildReorganizeは同じではないことに注意してください:

8
James Jenkins