【问题标题】:materialized view creation is fast but refresh takes hours物化视图创建速度很快,但刷新需要几个小时
【发布时间】:2013-02-05 16:41:47
【问题描述】:

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

当我创建物化视图时,大约需要 20 30 秒。但是,当我试图刷新它时。 花了超过2 3个小时。总记录数只有46万左右。

有人知道它会如何发生吗?

谢谢

代码如下

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 分钟相比

【问题讨论】:

  • 如果可能,您应该包括您的 MV 定义。
  • 我已经上传了我的代码...谢谢
  • 当您按需刷新时,您可能会考虑将atomic_refresh =&gt; false 作为参数传入,以强制截断表格然后填充。看到这个great answer。
  • 这很有意义..我正在尝试这个命令......它现在仍在运行(6分钟)..原始命令花了 160 分钟......我将不断更新由此带来的性能提升命令...非常感谢..
  • 这似乎不是我问题的根本原因......它仍在运行......现在超过 40 分钟

标签: oracle plsql oracle10g materialized-views


【解决方案1】:

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

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

我会使用 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 查询。因此,取决于您的情况和需求。

【讨论】:

  • as Wolf 和你的建议...我尝试使用 atomic_refresh=>false 运行推荐...刷新视图需要 141 分钟,而没有它需要 159 分钟...尤其是与 20 30 相比在我创建视图的几秒钟内.. 它花费了太长时间
  • "created the view" 过去式,当其他东西在盒子上运行或不运行时,当数据不同时,缓冲区缓存不同,可能有很多因素,不确定。如果您今天删除/创建 mat 视图(使用 build immediate),然后使用 dbms_mview (atomic_refresh false) 完成刷新,看看会发生什么
  • 是的...这是我想到的第一件事...我尝试过从昨天晚上到今天下午的不同时间范围...但是每当我放弃物化视图并重新创建时它,只用了不超过 30 秒......当我运行命令刷新之后,花了几个小时才完成
【解决方案2】:

你可以测试一下。我手动运行它,它适用于我的朋友:)

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;

希望对你有帮助。 :)

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 在我们的 prod 域中,我们在创建/删除操作发生时发送了审核电子邮件。我想了解为什么刷新比创建时间长...
    猜你喜欢
    • 2021-11-18
    • 2010-12-22
    • 1970-01-01
    • 2013-12-04
    • 2013-06-28
    • 2020-03-13
    • 1970-01-01
    • 2017-06-25
    • 2021-11-06
    相关资源
    最近更新 更多