2

DBグル、

誰かが私を正しい方向に向けてくれることを願っています。

私は2つのテーブルを持っています。テーブル A とテーブル B。システムが起動すると、テーブル A のすべてのエントリが処理され、テーブル B にコピーされます (テーブル B のスキーマに従って)。テーブル A には数万行を含めることができます。

システムが稼働している間、テーブル B は DB 変更通知を介してテーブル A と同期されます。

システムが再起動された場合、またはサービスが再起動された場合、テーブル B を再初期化したいと考えています。ただし、可能な限り最小限の DB 更新でこれを行いたいと考えています。具体的には、次のことを行います。

  • テーブル A にあるがテーブル B にはない行を追加し、
  • テーブル A にはなく、テーブル B にあるすべての行を削除します。
  • テーブル A とテーブル B に共通する行はそのままにしておく必要があります。

今、私は「DBガイ」ではないので、これを行う従来の方法は何だろうと思っています。

4

5 に答える 5

2

exists処理を最小限に抑えるために使用します。

これらの線に沿った何かが、結合が正しくなるように変更されました(また、私が愚かなことをしていないことを確認し、あなたの説明TableAからTableB逆戻りしてください):

insert into TableB
    select 
        *
    from
        TableA a
    where
        not exists (select 1 from TableB b where b.ID = a.ID)

delete from 
    TableB b
where
    not exists (select 1 from TableA a where a.ID = b.ID)
于 2009-11-25T21:12:17.453 に答える
1

Informix のエンタープライズ レプリケーション機能は、これらすべてを実行します。ER は、1 つのサーバーから別のサーバーに論理ログを送信し、それらをセカンダリでロール フォワードすることによって機能します。

必要に応じて細かく設定できます (つまり、ほんの一握りのテーブル)。

「DB変更通知」という用語を使用しています-すでにERを使用していますか、それともトリガーベースの取り決めですか?

何らかの理由で ER が構成で機能しない場合は、非同期で動作するように通知モデルを書き直すことをお勧めします。

  • タイムスタンプまたはシリアルフィールドを含むサーバー「A」のテーブルに通知を書き込みます
  • 最後に処理されたレコードのタイムスタンプ/シリアル値を格納するテーブルをサーバー「B」に作成します
  • サーバー 'B' で次のようなデーモン プロセスを実行します。
    • 「A」と「B」のタイムスタンプ/シリアルを比較します
    • 'A' と 'B' タイムスタンプの間の 'A' レコードを選択します
    • それらのレコードを「B」に処理します
    • 'B' タイムスタンプ/シリアルを更新
    • 適切な時間スリープし、ループします

したがって、サーバー「B」は、そのコピーが「A」と同期していることを確認する責任があります。「A」は、「B」が利用できなくても不便ではありません。

于 2009-11-26T01:15:43.540 に答える
0

簡単な方法は、最後の更新以降に発生したAからの変更を配置する履歴テーブルを使用し、AからBに直接コピーする代わりに、そのテーブルを使用してテーブルBを同期することです。同期が完了したら、履歴テーブル全体を削除して、新たに開始します。

私が理解していないのは、サービスまたはコンピューターが実行されていない場合に、テーブルAを更新し、Bではなく更新する方法です。それらは2つの異なるデータベースまたはサーバーで見つかりますか?

于 2009-11-25T21:10:44.150 に答える
0

comon列に従って両方のテーブルのデータを結合すると、両方のテーブルで一致する行、つまりAとBのデータが得られます。次に、この値をset操作(setマイナス操作)で使用します(このセットをMと呼びます)。違いを取得します。

最初の要件:AマイナスM 2番目の要件:Bマイナス3番目の要件:M

アイデアはわかりますか?

于 2009-11-25T21:12:35.320 に答える
0

私は Sql Server の専門家ですが、Sql Server 2008 以降、この種の操作については、機能呼び出しMERGEを利用できます。

MERGE ステートメントを使用すると、単一のステートメントで挿入、更新、および削除操作を実行できます。

だから私はグーグルでそのInformix also supports the same MERGE ステートメントを見つけましたが、挿入と更新が処理されているにもかかわらず、削除も処理するかどうかはわかりません。さらに、このステートメントはそれ自体でトランザクションを処理します

于 2009-11-26T02:11:41.010 に答える