Oracle调度程序将物化视图调用更改为CTAS

时间:2012-12-13 15:07:10

标签: sql performance oracle scheduler job-scheduling

我有一个具有以下结构的存储过程:

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作为select语句。我是否因此而受到一些性能影响,为什么链条决定使用CTAS而不是MV?

1 个答案:

答案 0 :(得分:1)

我将在这个答案中巩固我的评论。可能存在CTAS发射的多种原因之一 -

  1. 架构级别有一个DDL触发器可以执行CTAS,但除非有自定义DDL触发器,否则不太可能。
  2. 还有另一种可能性,可以在创建MV时触发CTAS ON PREBUILT TABLE子句,但我没有看到它被使用。
  3. Oracle MV pre-requisites说 -
  4.   

    创建物化视图时,Oracle数据库会创建一个   内部表和至少一个索引,并且可以创建一个视图   物化视图的模式。 Oracle数据库使用这些   用于维护物化视图数据的对象。你必须拥有   创建这些对象所需的权限。

    可能解释了CTAS。

    到目前为止,第3点看起来是您所看到的CTAS的最佳解释。