我有一个具有以下结构的存储过程:
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?
答案 0 :(得分:1)
我将在这个答案中巩固我的评论。可能存在CTAS发射的多种原因之一 -
ON PREBUILT TABLE
子句,但我没有看到它被使用。创建物化视图时,Oracle数据库会创建一个 内部表和至少一个索引,并且可以创建一个视图 物化视图的模式。 Oracle数据库使用这些 用于维护物化视图数据的对象。你必须拥有 创建这些对象所需的权限。
可能解释了CTAS。
到目前为止,第3点看起来是您所看到的CTAS的最佳解释。