Sql 将表从外部数据库复制到内部数据库
出于性能原因,我需要将表从外部数据库复制到内部数据库。一些应用程序将使用此本地数据库进行连接和比较数据。我只需要每隔一小时左右进行一次复制,但如果有性能解决方案,我更愿意每5到10分钟进行一次复制 复制的最佳方式是什么?首先想到的是放弃,然后创造:Sql 将表从外部数据库复制到内部数据库,sql,oracle,Sql,Oracle,出于性能原因,我需要将表从外部数据库复制到内部数据库。一些应用程序将使用此本地数据库进行连接和比较数据。我只需要每隔一小时左右进行一次复制,但如果有性能解决方案,我更愿意每5到10分钟进行一次复制 复制的最佳方式是什么?首先想到的是放弃,然后创造: DROP TABLE clonedTable; CREATE TABLE clonedTable AS SELECT * from foo.extern@data.sourceTable; 一定有更好的办法,对吧?希望能有一个原子解决方案来避免表不
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;
哇,谢谢你提供的所有信息。那语法正确吗?我试图创建物化视图,在下一个语句后得到了“此处不允许列”。我认为选项一是解决我的情况的最佳方法。他们将如何“在源表上创建物化视图日志”?我是否需要将这些刷新参数从完整更改为快速?