2

1か月前のデータをlogging テーブルからlogging-archive テーブルに移動し、1 年以上前のデータを後のテーブルから削除する必要があります。

大量のデータがあります (2 か月で 600k 挿入)。

毎日/毎週、ストアド プロシージャを単純に呼び出す (バッチ処理する) ことを検討していました。

私は最初に2ストアドプロシージャを実行することを考えました:

  1. アーカイブから365 日より古いものを削除する
  2. ロギングからアーカイブへのデータの移動、30日より古いもの(1つのSQLクエリでそれを行う方法があると思います
  3. 30 日より古いものをログから削除します。

ただし、この解決策は非常に非効率的で、DB が数分間ロックされる可能性があります。これは望ましくありません。

では、代替手段はありますか?それらは何ですか?

4

2 に答える 2

3

実際に使用するテーブルをロックする必要はありません。現在、テーブルのみに書き込みを行っておりlogging、新しいレコードのみに書き込みを行っています。

テーブルから OLD レコードのみを選択しlogging、アーカイブ プロセスを除いて書き込みを行わないテーブルに書き込みます。

あなたが取っているステップはうまく聞こえます。さらに一歩進んで、日付に基づいて削除する代わりにINNER JOIN、フィールドのアーカイブ テーブルをid削除するだけです。その後、アーカイブした特定のレコードのみを削除します。

ちなみに、600k レコードはそれほど大きくありません。20 億行を超えるテーブルを備えた運用 DB があり、トランザクション テーブルに 1 分間に数百万の挿入を行う DB を持っている人もいます。

編集:

最初に含めるのを忘れていましたが、計画された方法のもう1つの利点は、各ステップが分離されていることです。何らかの理由で停止する必要がある場合、どのステップも破壊的ではなく、すぐに実行される次のステップに依存しません。潜在的に多くのレコードをアーカイブし、翌日または夜間に削除を実行しても、問題は発生しません。

于 2011-07-19T20:54:14.287 に答える
0

セカンダリ データベースにアーカイブした場合はどうでしょうか。

すなわち:

プライマリ データベースにはログ テーブルがあります。

セカンダリ データベースにはアーカイブ テーブルがあります。

そうすれば、バッチを実行できるようにアーカイブ テーブルをロックすることを心配している場合でも、プライマリ データベースがダウンすることはありません。

しかし、いずれにせよ、ロックについて心配する必要があるかどうかはわかりません。実装方法に依存していると思います。

于 2011-07-19T20:59:48.720 に答える