2

パフォーマンス上の理由から、テーブルを外部データベースから内部データベースに複製する必要があります。いくつかのアプリは、このローカルデータベースを使用して結合を行い、データを比較します。1時間程度ごとに複製する必要がありますが、パフォーマンスソリューションがある場合は、5〜10分ごとに複製することをお勧めします。

複製するための最良の方法は何でしょうか?最初に頭に浮かぶのは、DROP、次にCREATEです。

DROP TABLE clonedTable;
CREATE TABLE clonedTable AS SELECT * from foo.extern@data.sourceTable;

より良い方法が必要ですか?うまくいけば、テーブルが存在しないが誰かがそれを照会しようとするかもしれない秒の端数を避けるためのアトミックソリューション。

4

1 に答える 1

2

考えられる最も簡単な解決策は、1時間ごとに更新するように設定されたマテリアライズドビューです。

CREATE MATERIALIZED VIEW mv_cloned_table
  REFRESH COMPLETE 
  START WITH sysdate + interval '1' minute
  NEXT sysdate + interval '1' hour
AS
SELECT *
  FROM foo.external_table@database_link;

これにより、現在存在するすべてのデータが削除さmv_cloned_tableれ、テーブルからすべてのデータが外部データベースに挿入され、終了後1時間で再度実行されるようにスケジュールされます(したがって、実際には1時間以上、更新と更新の間に更新にかかる時間になります) )。

これを最適化する方法はたくさんあります。

  • ソースデータベースを所有している人々がそれに従順である場合は、ソーステーブルにマテリアライズドビューログを作成するように依頼できます。これにより、マテリアライズド・ビューで変更のみを複製できるようになります。これにより、はるかに効率的になり、更新をより頻繁にスケジュールできるようになります。
  • ソースデータベースを所有している人々の協力があれば、マテリアライズドビューの代わりにStreamsを使用して、ほぼリアルタイムで変更を複製することもできます(数秒の遅延が一般的です)。また、マテリアライズドビューログを維持するよりも、ソースシステムで効率的である傾向があります。ただし、すべてを適切に機能させるには、管理に時間がかかる傾向があります。マテリアライズド・ビューは、柔軟性と効率がはるかに低くなりますが、構成は非常に簡単です。
  • リフレッシュ中にテーブルが空であってもかまわない場合(テーブルは存在し、データがないだけです)、マテリアライズド・ビューで非アトミック・リフレッシュを実行できます。これにより、マテリアライズド・ビューのTRUNCATE後に直接パスが続きますINSERT。 aDELETEおよび従来のパスINSERT。前者の方がはるかに効率的ですが、ローカルサーバーで結合とデータ比較を行っているときにテーブルが空に見えることを意味します。これは、この状況では適切ではないようです。

ソース側でマテリアライズドビューログを作成してインクリメンタルリフレッシュを実行できるようにする場合は、ソーステーブルに主キーがあると仮定して、ソース側で次のように依頼します。

CREATE MATERIALIZED VIEW LOG ON foo.external_table
  WITH PRIMARY KEY
  INCLUDING NEW VALUES;

作成するマテリアライズドビューは次のようになります

CREATE MATERIALIZED VIEW mv_cloned_table
  REFRESH FAST
  START WITH sysdate + interval '1' minute
  NEXT sysdate + interval '1' hour
  WITH PRIMARY KEY
AS
SELECT *
  FROM foo.external_table@database_link;
于 2012-12-19T00:14:51.000 に答える