Sql 将表从外部数据库复制到内部数据库

Sql 将表从外部数据库复制到内部数据库,sql,oracle,Sql,Oracle,出于性能原因,我需要将表从外部数据库复制到内部数据库。一些应用程序将使用此本地数据库进行连接和比较数据。我只需要每隔一小时左右进行一次复制,但如果有性能解决方案,我更愿意每5到10分钟进行一次复制 复制的最佳方式是什么?首先想到的是放弃,然后创造: DROP TABLE clonedTable; CREATE TABLE clonedTable AS SELECT * from foo.extern@data.sourceTable; 一定有更好的办法,对吧?希望能有一个原子解决方案来避免表不

出于性能原因,我需要将表从外部数据库复制到内部数据库。一些应用程序将使用此本地数据库进行连接和比较数据。我只需要每隔一小时左右进行一次复制,但如果有性能解决方案,我更愿意每5到10分钟进行一次复制

复制的最佳方式是什么?首先想到的是放弃,然后创造:

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

一定有更好的办法,对吧?希望能有一个原子解决方案来避免表不存在的那一瞬间,但有人可能会尝试查询它。

最简单的解决方案是设置为每小时刷新一次的物化视图

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小时)

有很多方法可以优化这一点

  • 如果拥有源数据库的人愿意接受它,您可以要求他们在源表上创建物化视图日志。这将允许您的物化视图只复制更改,这将更加高效,并允许您更频繁地安排刷新
  • 如果您与拥有源数据库的人员合作,您还可以使用流而不是物化视图,这样您就可以近乎实时地复制更改(通常延迟几秒钟)。这在源系统上往往比维护物化视图日志更有效。但要让一切正常工作,往往需要更多的管理时间——物化视图的灵活性和效率要低得多,但配置起来却非常容易
  • 如果您不介意表在刷新期间为空(它可能存在,它只是没有数据),您可以在物化视图上执行非原子刷新,这将执行
    截断
    ,然后执行直接路径
    插入
    ,而不是
    删除
    和常规路径
    插入
    。前者效率更高,但这意味着在本地服务器上执行联接和数据比较时,表将显示为空,这在这种情况下似乎不太合适
如果您想让源端创建一个物化视图日志,这样您就可以在源端进行增量刷新,假设源表有一个主键,那么您可以要求他们这样做

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;

哇,谢谢你提供的所有信息。那语法正确吗?我试图创建物化视图,在下一个语句后得到了“此处不允许列”。我认为选项一是解决我的情况的最佳方法。他们将如何“在源表上创建物化视图日志”?我是否需要将这些刷新参数从完整更改为快速?