2017-01-10 2 views
0

大量のトランザクションを取得する巨大な表がありますが、更新された時刻を知るタイムスタンプの列はありません。私たちのDBAの1人は、SP内でORA_ROWSCNを使用して、最近更新された/挿入された行を知り、DBリンク経由でリモート(アーカイブ)データベースに送ることを提案しました。これを行うには良いアイデアですORA_ROWSCNを使用してソースからリモート・データベースへの表のアーカイブ

select * from huge_table where ora_rowscn<=max_rowscn /* from previous query */ 

select max(ora_rowscn) max_rowscn from huge_table where ora_rowscn <= timestamp_to_scn(trunc(sysdate)); 

すると以下のようにアーカイブするための行を送信しますか?このシナリオは通常どのようにOracleで処理されますか?

+0

の前のrowscnを保存しています)? – Boneist

+0

@Boneistはい、我々はより安いルートを最初に取ることを考えました。 :-) – toddlermenot

答えて

2

私はあなたのデータベースに大きな変更を加えたくないと思います。そうしないと、この目的のために特別に構築されたOracleメカニズムを使用できます。 Oracle Streams

ORA_ROWSCNを使用した問合せは、設定に役立ちます。しかし、あなたはそれがブロックレベルで正確ではなく、ただ上限で追跡されていることに気づく必要があります。 ORA_ROWSCN Pseudocolumnも参照してください。

したがって、ソリューションは変更されていないにもかかわらず行がアーカイブデータベースに送信されるケースを処理できる必要があります。他のケース(行は変更されたが送信されない)は発生しない。

+0

答えをいただきありがとうございます。あなたの前提が正しいと思います。私たちは、この問題を解決するためだけに大きな変更を加えず、Oracleライセンスを購入したくありません。同じ行を送信する可能性があると言うと、同じブロック内に複数の行が存在する可能性を暗示します。レコードの1つだけが実際に変更されても、ブロックは新しいORA_ROWSCNを取得しますか?そうであれば、同じブロックに実際にいくつのレコードが存在するかを調べ、この確率を計算する方法があります> – toddlermenot

+0

はい、それが起こる主なケースです。また、関連するテーブルのブロック内の平均行数を調べるために新しい質問を投稿することをお勧めします。これは、一部のデータ・ディクショナリ・ビューを問い合せることによって導出できます。 – Codo

1

@Codoによる解決策に同意します。以下の理由により、Oracle StreamsまたはOracle Data Guard製品を使用して問題を解決してください。

  1. 大規模なテーブルがあります。フルテーブルスキャンは、CPUとディスクのリソースに関して非常にコストがかかります。
  2. rowscanデータがブロックレベルで維持され、ブロック内のどのレコードが更新されているかを知ることができないため、アプローチは最適ではありません。この方法でHUGEテーブルの半分以上をコピーすることは可能です。これは非常にリソース集約的です。

ソリューション

  • あなたは巨大なテーブルの上に各更新時のパフォーマンスへの影響を妥協する準備ができているならば、私はトリガーベースのアプローチを示唆しています。テーブルが更新されるたびに、行を識別するためのエントリを追加します(rowidの場合でも、rowidのrowidは最終的なものではなく、複数の理由で変更可能です)。新しいテーブルに格納します。この表を参照として使用して、データをアーカイブ表に移動します。あなたの更新アクションの応答時間に影響がありますが、これはあなたが今考えているアプローチよりもずっと少ないでしょう。

  • その他のオプションは、アーカイブデータベースを使用してアーカイブログを使用して非同期データ複製を設定することです。このアプローチは古典的なものであり、テーブル構造やデータの変更以外の解決策を必要とします。このリンクはあなたを助けるかもしれません。 https://docs.oracle.com/cd/B28359_01/server.111/b28313/cdc.htm

+0

あなたの答えをありがとう。 [2]に関して、あなたは変わらない行を送ることがどれくらい可能性があるかを精緻に教えてもらえますか? – toddlermenot

+0

典型的なブロックサイズは8Kです。これを変更すると、パフォーマンスに影響があります(トランザクションパターンによっては正または負になることがあります)。いいえわかりません。典型的なブロックの行数。このスレッドhttp://www.dba-oracle.com/t_rows_per_block.htmを見てください。テーブルの統計が最近のものであることを確認してください。それ以外の場合は、平均行長が正しくない可能性があります。 –

+0

rowscanデータはブロックレベルで保存されるため、ブロックのすべての行をアーカイブする必要があります。 –

1

オラクルでは行レベルでora_rowscnを追跡するオプションがあります。 残念ながら、このオプションはテーブルの作成中にオンにする必要があります。

いつでも新しいテーブルを作成してそのテーブルに移入できます。'dbms_redefinitionまたは選択として挿入' create table xxx (blbl, ble, ble) rowdependencies;

しかし、1つの問題が残っています。古い日付のrow_scnは計算できません。

select timestamp_to_scn(trunc(sysdate-100)) from dual; 照会は、控除を出すべきです。 ORA-08180: no snapshot found based on specified time

ソリューションは、私はそれがあなたのDBAが調査し、[のGoldenGate](http://www.oracle.com/technetwork/middleware/goldengate/overview/index.htmlを使用して割り引いた取る他の場所

関連する問題