【问题标题】:Oracle scheduler changes materialized view call into CTASOracle 调度程序将物化视图调用更改为 CTAS
【发布时间】:2012-12-14 00:01:24
【问题描述】:

我有一个具有这种结构的存储过程:

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

【问题讨论】:

  • 您在跟踪 CREATE MATERIALIZE VIEW 会话时是否看到 CTAS?它可能是始终与 CREATE 语句一起运行但仅在从调度程序运行时以某种方式公开的依赖 DDL。
  • @VincentMalgrat 好问题,让我打开跟踪
  • 是否有任何用于记录的 DDL 触发器在 CREATE 上触发?
  • @Annjawn 不会使用 nologging 来排除这种情况吗?
  • 我猜不是。那将是 MV 属性,但 DDL 触发器独立于该属性,并且会在发出的任何/特定 DDL 语句上触发。但这是一个长远的目标,因为除非 DBA 完成任何自定义工作,否则 DDL 触发器没有理由执行 CTAS。不过,DDL 触发器将位于架构级别。

标签: sql performance oracle scheduler job-scheduling


【解决方案1】:

我将在这个答案中巩固我的 cmets。 CTAS 会触发的原因可能有多种原因之一-

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

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

这或许可以解释 CTAS。

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

【讨论】:

  • 因为ON PREBUILT TABLE创建表(而是重用现有表),我怀疑这是否是使用 CTAS =) 的正当理由。这也不能解释为什么只有在从调度程序调用过程时才能看到该语句。
  • 我不确定它是否“仅”从调度程序中显示。如果它从调度程序中显示出来,那么如果从其他任何地方运行它就会显示出来。
猜你喜欢
  • 2010-10-14
  • 2019-03-04
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 2023-03-08
  • 2013-03-01
  • 1970-01-01
相关资源
最近更新 更多