0

次の構造を持つストアド プロシージャがあります。

CREATE OR REPLACE PROCEDURE refresh_mv(p_mv_name VARCHAR2) AS
BEGIN
   EXECUTE IMMEDIATE '
      CREATE MATERIALIZED VIEW ' || dbms_assert.simple_sql_name(p_mv_name) || '
      PARALLEL
      NOLOGGING
      NEVER REFRESH
      AS
      SELECT * FROM <biq_query>';
   EXECUTE IMMEDIATE 
      'CREATE OR REPLACE VIEW outside_view AS SELECT * FROM '||p_mv_name;
   -- DROP old mv?
END;

これが SQL 開発者内から実行されると、OEM はアクティビティにマテリアライズド ビュー ステートメントを正しく表示します。ただし、これと同じ手順をチェーン内の Oracle スケジューラから実行すると、create table as select ステートメントが生成されます。このために私が取っているパフォーマンスヒットはありますか? さらに、チェーンが MV よりも CTAS を使用することを決定したのはなぜですか?

4

1 に答える 1

1

この回答でコメントをまとめます。CTAS が起動する理由として、次の複数の理由のいずれかが考えられます。

  1. CTAS を実行するスキーマ レベルの DDL トリガーがありますが、カスタム DDL トリガーが配置されていない限り可能性は低いです。
  2. MVの作成中に句であるCTASを起動できる別の可能性がありますが、ON PREBUILT TABLEそれが使用されていることはわかりません。
  3. Oracle MVの前提条件は言う -

マテリアライズド・ビューを作成すると、Oracle Databaseは1つ の内部表と少なくとも1つの索引を作成し、場合によっては1つのビューをすべてマテリアライズド・ビューのスキーマ内に作成します。Oracle Databaseは、これらのオブジェクトを使用してマテリアライズド・ビュー・データを維持します。これらのオブジェクトを作成するために必要な権限が必要です。

おそらくCTASを説明できます。

これまでのところ、ポイント 3. は、あなたが見ている CTAS の最良の説明のように見えます。

于 2012-12-13T16:01:24.923 に答える