物化视图创建速度快但刷新需要数小时

时间:2013-02-20 15:42:10

标签: oracle plsql oracle10g materialized-views

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

当我创建物化视图时,花了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

3 个答案:

答案 0 :(得分:4)

我个人不会使用内置于mat视图CREATE语句中的调度程序(以...开头的子句)。

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

我会使用dbms_mview.refresh('MY_MATVIEW','C', atomic_refresh =&gt; false )。这会:

  1. 截断MY_MATVIEW快照表
  2. 将附加内容插入MY_MATVIEW表
  3. 如果你在create语句中使用next子句,它将设置一个原子刷新,这意味着它将:

    1. 从MY_MATVIEW
    2. 删除*
    3. 插入MY_MATVIEW
    4. 提交
    5. 这将更慢(有时慢得多),但其他人仍然可以在刷新过程中从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秒来创建,为什么不只是删除并重新创建物化视图而不是刷新它?