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

4

1 回答 1

1

我将在此答案中合并我的评论。CTAS 开火的原因可能是多种原因之一——

  1. 在模式级别有一个 DDL 触发器,它执行 CTAS,尽管除非自定义 DDL 触发器到位,否则不太可能。
  2. 还有另一种可能性可以触发 CTAS,这是ON PREBUILT TABLE创建 MV 时的子句,但我没有看到它被使用。
  3. Oracle MV先决条件说 -

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

这可能可以解释 CTAS。

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

于 2012-12-13T16:01:24.923 回答