4

開発者がデータベースをローカルマシンにロードできるように、いくつかのデータベースを縮小しようとしています。X日より古いレコードを削除すると、データベース全体のサイズ(50%以上)が大幅に減少する履歴データ(10年以上の価値)を保持するテーブルをいくつか特定しました。

私が使用しているdeleteステートメントを以下に示しますが、私の質問は、このdeleteステートメントの速度をどのように改善できるかということです。データベースはすでに単純なログ形式になっていますが、ログは引き続きdeleteステートメントで大きくなります。より良いロギング方法はありますか?

私はこれを行う方が良いでしょうか:

  1. 保持したいデータを現在のテーブルから一時テーブルにコピーし、
  2. プライマリテーブルを切り捨て、
  3. データを一時からプライマリに戻し、
  4. シュリンクログ、
  5. 縮小する必要のあるすべてのテーブルを処理したら、データベースを縮小します。

クエリの例:

DELETE FROM LoginAttempts WHERE DateAttempt <= GETDATE() - 30
4

4 に答える 4

2

TRUNCATEまた、REDOロギングの生成が少ないため、テーブル全体CREATE AS SELECTを削除するよりもはるかに高速です。

ただし、これらはDDLコマンドであり、一部のシステムではロールバックできません。

ただし、DELETE削除する行が少ない場合は、さらに高速になる可能性があります。

行の半分を削除する場合は、少なくとも最初のオプションの方が高速になる可能性がありますOracle

于 2009-10-07T14:21:45.470 に答える
1

保持したいデータを移動するオプションは非常に有効ですが、保持する量が削除されるデータと比較して少ない場合にのみ機能します。

削除をより効率的に実行するには、上位1000行のみを削除する削除操作をバッチ処理して(order句を使用しないでください)、各削除トランザクションのサイズを小さく保ち、ロックを保持しない/多くの一時を使用することをお勧めします。等

すべてのデータを削除した後にデータベースを縮小すると、インデックスが断片化されます。ファイルグループを縮小する必要がある場合は、データを別のファイルグループに移動し、可能であれば元のファイルを削除します。縮小すると断片化され、インデックスを再作成して使用します。再びより多くのスペース(そしてあなたは無駄にそれを繰り返すことができます)

于 2009-10-07T14:22:17.713 に答える
0

保持したいデータを一時テーブルに抽出し、元のテーブルを切り捨ててから元に戻すというアイデアに夢中になっていると思います。

抽出したデータを使用して新しいテーブルを作成し、新しいテーブルを削除して元のテーブル名に名前を変更することもできます。これはエラーが発生しやすいように見えますが、メンテナンス期間中にこの種の作業を行っている場合は、おそらく問題ありません。

于 2009-10-08T15:18:41.647 に答える
0

可能な場合は切り捨てを使用します。これは、はるかに高速であるためです。ただし、テーブルを参照する外部キーがある場合、これは機能しません。

大きなテーブルでこれらのタイプの削除ステートメントを実行する場合、過去N日間を一時テーブルに選択し、テーブルを削除し、再作成して挿入する方が高速です。ただし、外部キーがある場合、これは注意が必要です。

トランザクションログのディスク容量を最大化するのに問題があったため、一度にN行を削除し続けるwhileループを使用することがありました。

また、データベースがSimple Transactions Logsを使用していることを確認する必要がある場合は、自動縮小を設定することもできます。

于 2009-10-07T14:26:24.103 に答える