2016-09-01 5 views
1

私は墓地のテーブルには必要ないレコードを移動することでデータベースにガベージコレクションをいくつかしようとしています。 私はこれらの4つのテーブル持っているのであれば -javaを使用してmysqlのあるテーブルから別のテーブルにレコードをたくさん移動する

  1. バージョンを
  2. Version_history(VERSION_IDが外部キーである)
  3. Version_graveyard(ここでは廃棄されたバージョンの行)
  4. Version_history_graveyard(廃棄されたバージョン履歴(idが主キーです)ここでは行)

それは、次の手順で構成 -

  • 削除するすべてのバージョンIDを取得します。
  • 削除するバージョンIDについて全員に通知します。 (実際の移動の前にバージョンテーブルから行を取得する必要があります - それは非常に複雑な選択クエリです)
  • 元のバージョンテーブルからVersion_graveyardテーブルへの選択を行います(これは基本的には、前のステップで)
  • もう1つ挿入する元のVersion_historyテーブルからVersion_graveyard_historyテーブルに選択します。あなたは、これは多くの選択クエリを繰り返すことが必要になり見ることができるように(再び同じ選択クエリを使用する。)、元のテーブルから
  • 削除データ

を(再び私はすでに使用している選択クエリを繰り返すことになります)回。 (

Insert into Version_Graveyard Select * from Version where id in (?, ?, ..... ?); 

Delete from Version Where id in (?, ?, .. ?) 

しかし、問題は、削除するバージョンの数は何千可能性がある - 私は、最初のクエリからのすべてのバージョンを取得し、その後NamedParameterJdbcTemplateのBATCHUPDATE機能を使用するなど、後続のすべてのクエリのWHERE句ではと思いました最初の実行時〜20K)とdocumentationによると、IN句の中に1000を超える値を持つことはできません。

したがって、複数の手順で同じ選択クエリを繰り返さないようにするにはどうすればよいでしょうか。

+0

どのようにIDを取得しますか? 'select ...'によってidを置き換えることができます。query – CSK

+1

一時テーブルを作成し、一時テーブルに移動するレコードのIDを挿入して使用します。 – Andreas

答えて

0

複数のIN句をORで結合することができます。

SELECT * FROM VERSION WHERE ID IN (...) OR ID IN (...) OR ID IN (...) 
1

ことが可能レコードが墓地テーブルに移動し、次の時間でなければならないことを示しVersionVersion_history表に特別なフィールド(フラグ)を追加することになります。たとえば、exportToGraveyardです。

次のステップは、フィールドを設定するSELECTの代わりにUPDATEを実行することです。他のすべてのクエリーは、フラグによって移動されるべきすべてのレコードにアクセスできるようになりました。

パフォーマンスの最適化のために、フィールドにINDEXを追加することもできます。しかし、INDEXに注意すると、UPDATEステートメントは遅くなるはずです。

関連する問題