5

マテリアライズド ビューを使用していますが、一部のテーブルがマテリアライズド ビュー ログを持たないリモート データベースからのものであるため、高速更新に設定できません。

マテリアライズド ビューを作成すると、20 30 秒ほどかかりました。しかし、私がそれをリフレッシュしようとしていたとき。23時間以上かかりました。レコードの総数は約 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 分かかりました... vs atom_refresh=>false なしでは 159 分

4

3 に答える 3

4

個人的には、mat ビューの CREATE ステートメントに組み込まれているスケジューラーは使用しません (... next 句で開始)。

(私にとって)主な理由は、この方法でリフレッシュを非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 からクエリを実行できます。したがって、状況とニーズに応じて異なります。

于 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 に答える