【发布时间】: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