5

我正在使用物化视图,我无法将其设置为快速刷新,因为某些表来自没有物化视图日志的远程数据库。

当我创建物化视图时,大约需要 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=>false) 但它仍然需要 141 分钟才能运行......而没有 atomic_refresh=>false 需要 159 分钟

4

3 回答 3

4

我个人不会使用 mat view CREATE 语句中内置的调度程序(从 ... next 子句开始)。

主要原因(对我来说)是你不能以这种方式声明刷新非原子(至少我在创建时没有找到它的语法)。根据您的刷新要求和大小,这可以节省大量时间

我会使用 dbms_mview.refresh('MY_MATVIEW', 'C', atomic_refresh=>false )。这个会:

  1. 截断 MY_MATVIEW 快照表
  2. 将追加插入到 MY_MATVIEW 表中

如果您在 create 语句中使用 next 子句,它将设置原子刷新,这意味着它将:

  1. 从 MY_MATVIEW 中删除 *
  2. 插入 MY_MATVIEW
  3. 犯罪

这会更慢(有时慢得多),但其他人仍然可以在刷新时从 MY_MATVIEW 查询。所以,看你的情况和需要。

于 2013-02-20T20:07:32.180 回答
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);

结尾; /

然后你可以用这个摧毁它。

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;

我希望它可以帮助你。:)

于 2014-05-23T07:35:52.190 回答
0

如果创建只需要 20-30 秒,为什么不直接删除并重新创建物化视图而不是刷新它呢?

于 2013-02-20T15:43:32.497 回答