考えられる最も簡単な解決策は、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;