1

システムで一部のテーブルのデータを更新 (または削除、挿入) する必要があります。しかし、どのデータが更新、削除、挿入されたか知りたいです。したがって、データが変更される前に、次のように別のスキーマでテーブルをバックアップします。

create table backup_table as select * from schema1.testtable

データが変更された後、backup_table と testtable の違いを見つけたいと思い、その違いをバックアップ スキーマのテーブルに保存したいと考えています。

私が実行するSQLは次のようなものです:

 CREATE TABLE TEST_COMPARE_RESULT
 AS
 SELECT 'BEFORE' AS STATUS, T1.*
 FROM (
        SELECT * FROM backup_table
        MINUS
        SELECT * FROM schema1.testtable
 ) T1
 UNION ALL
 SELECT 'AFTER' AS STATUS, T2.*
 FROM (
        SELECT * FROM schema1.testtable
        MINUS
        SELECT * FROM backup_table
  ) T2

私が心配しているのは、マイナス操作が多くのシステム リソースを使用すると聞いたことです。私のシステムでは、一部のテーブル サイズが 700M を超えます。したがって、オラクルがメモリ内の 700M データをどのように読み取るかを知りたいです (PGA) ??) または一時表領域? リソースが比較操作に十分であることを確認するにはどうすればよいですか?

4

1 に答える 1

4

マイナスは確かにリソースを集中的に使用するタスクです。両方のテーブルを読み取り、並べ替えを行って 2 つのテーブルを比較する必要があります。ただし、Oracle にはこれを行うための高度な技術があります。それができない場合、両方のテーブルをメモリ (SGA) にロードしません。はい、ソートのために一時スペースを使用します。しかし、試してみることをお勧めします。クエリを実行して、何が起こるかを確認してください。データベースは影響を受けず、常にステートメントの実行を停止できます。

クエリのパフォーマンスを向上させるためにできること:

まず、変更されないことが確実な列がある場合は、それらを含めないでください。したがって、次のように書くことをお勧めします。

select a, b from t1
minus 
select a, b from t2

select * from tこれらの 2 つの列よりも多い場合は、作業が少なくなるため、を使用するよりも。

次に、比較するデータの量がシステムにとって非常に大きい場合 (一時スペースが小さすぎる場合) は、それらをチャンクで比較するようにしてください。

select a, b from t1 where col between val1 and val2
minus 
select a, b from t2 where col between val1 and val2 

確かに、いくつかのログ列を持つこと以外の可能性もminusあります。たとえば、updated_date としましょう。update_date がプロセスの開始よりも大きい場所を選択すると、更新されたレコードが表示されます。ただし、これは、データベース モデルと etl コードをどのように変更できるかによって異なります。

于 2013-02-25T06:54:03.500 に答える