我正在使用物化视图,我无法将其设置为快速刷新,因为有些表来自远程数据库,而没有物化视图日志。
当我创建物化视图时,花了20秒30秒。但是当我试图刷新它时。 花了超过2个3小时。记录总数仅为460,000左右。
有没有人知道它会如何发生?
由于
代码如下所示
create materialized view MY_MV1
refresh force on demand
start with to_date('20-02-2013 22:00:00', 'dd-mm-yyyy hh24:mi:ss') next trunc(sysdate)+1+22/24
as
( SELECT Nvl(Cr.Sol_Chng_Num, ' ') AS Change_Request_Nbr,
Nvl(Sr.Sr_Num, ' ') AS Service_Request_Nbr,
Nvl(Sr.w_Org_Id, 0) AS Org_Id,
Fcr.rowid,
Cr.rowid,
Bsr.rowid,
Sr.rowid,
SYSDATE
FROM Dwadmin.f_S_Change@DateWarehouse.World Fcr
INNER JOIN Dwadmin.d_S_Change@DateWarehouse.World Cr
ON Fcr.w_Sol_Chng_Id = Cr.w_Sol_Chng_Id
INNER JOIN Dwadmin.b_S_Change_Obl@DateWarehouse.World Bsr
ON Fcr.w_Sol_Chng_Id = Bsr.w_Sol_Chng_Id
INNER JOIN Dwadmin.d_S_Rec@DateWarehouse.World Sr
ON Sr.w_Srv_Rec_Id = Bsr.w_Srv_Rec_Id
WHERE Sr.Sr_Num <> 'NS'
);
我试过使用dbms_mview.refresh('MY_MATVIEW','C',atomic_refresh =&gt; false) 但它仍然需要141分钟才能运行... vs 159分钟没有atomic_refresh =&gt; false
答案 0 :(得分:4)
我个人不会使用内置于mat视图CREATE语句中的调度程序(以...开头的子句)。
主要原因(对我来说)是你不能以这种方式声明刷新非ATOMIC(至少我在CREATE时没有找到这个的语法)。根据您的刷新要求和尺寸,可以节省大量时间。
我会使用dbms_mview.refresh('MY_MATVIEW','C', atomic_refresh =&gt; false )。这会:
如果你在create语句中使用next子句,它将设置一个原子刷新,这意味着它将:
这将更慢(有时慢得多),但其他人仍然可以在刷新过程中从MY_MATVIEW查询。所以,取决于你的情况和需求。
答案 1 :(得分:1)
你可以测试一下。我手动运行它,它适用于我的朋友:)
BEGIN
DBMS_REFRESH.make(
name => 'DB_NAME.MINUTE_REFRESH',
list => '',
next_date => SYSDATE,
interval => '/*1:Mins*/ SYSDATE + 1/(60*24)',
implicit_destroy => FALSE,
lax => FALSE,
job => 0,
rollback_seg => NULL,
push_deferred_rpc => TRUE,
refresh_after_errors => TRUE,
purge_option => NULL,
parallelism => NULL,
heap_size => NULL);
END;
/
BEGIN
DBMS_REFRESH.add(
name => 'DB_NAME.MINUTE_REFRESH',
list => 'DB_NAME.MV_NAME',
lax => TRUE);
END; /
然后你可以用它来摧毁它。
BEGIN
DBMS_REFRESH.destroy(name => 'DB_NAME.MINUTE_REFRESH');
END;
/
您可以创建实体化视图日志。
CREATE MATERIALIZED VIEW LOG ON DB_NAME.TABLE_NAME
TABLESPACE users
WITH PRIMARY KEY
INCLUDING NEW VALUES;
我希望它可以帮到你。 :)
答案 2 :(得分:0)
如果只需要20-30秒来创建,为什么不只是删除并重新创建物化视图而不是刷新它?