问题描述
你好,
我们所有的MV都是通过nologging构建为完全可刷新,按需刷新的,如下所示:-
创建物化视图mv_name
NOLOGGING
表空间 “数据空间”
使用索引表空间 “INDEX_SPACE”
REFRESH ON DEMAND
COMPLETE
作为
-仅选择文本作为示例 (此SQL查询文本从CLOB列或CLOB过程的IN参数中动态填充,SELECT始终具有编译器提示,如图所示:
选择/*+ PARALLEL(8) NOLOGGING*/*
从tb_name_1
联盟
选择/*+ PARALLEL(8) NOLOGGING*/*
来自tb_name_2
;
创建MV并收集统计信息后,分析师开始使用MV,有时,根据性能和报告需求,我们可能必须在MV上的多个列上添加位图,唯一和非唯一索引。根据数据源自己的刷新时间表,每个MV可能具有不同的刷新时间表。
主要目标是建立一个 “精益” 刷新操作,尽可能多,这将有望导致刷新,这将花费最少的时间 (尽可能多,尽管由于SQL查询的性质,一些刷新将花费更长的时间等)。
在阅读DBMS_MVIEW.REFRESH的11.2文档后,它提到设置参数atomic_refresh => FALSE将负责 (a) 禁用,(b) 重建和 (c) 仅计算唯一索引的统计信息。
这是否意味着对于MV上存在的所有 “其他” 索引类型,例如位图和非唯一,我必须手动:-
(a) 在运行DBMS_MVIEW.REFRESH之前,禁用所有位图和非唯一索引 (忽略唯一索引),
(b) 使用参数运行DBMS_MVIEW.REFRESHmethod => 'C'和atomic_refresh => FALSE,
(c) Rebuild all BITMAP和NON-UNIQUE indexes (hoping the UNIQUE indexes will be re-built in the step above),
(d) 收集表统计信息,以计算表以及所有索引的统计信息。
感谢任何建议 :)
我们所有的MV都是通过nologging构建为完全可刷新,按需刷新的,如下所示:-
创建物化视图mv_name
NOLOGGING
表空间 “数据空间”
使用索引表空间 “INDEX_SPACE”
REFRESH ON DEMAND
COMPLETE
作为
-仅选择文本作为示例 (此SQL查询文本从CLOB列或CLOB过程的IN参数中动态填充,SELECT始终具有编译器提示,如图所示:
选择/*+ PARALLEL(8) NOLOGGING*/*
从tb_name_1
联盟
选择/*+ PARALLEL(8) NOLOGGING*/*
来自tb_name_2
;
创建MV并收集统计信息后,分析师开始使用MV,有时,根据性能和报告需求,我们可能必须在MV上的多个列上添加位图,唯一和非唯一索引。根据数据源自己的刷新时间表,每个MV可能具有不同的刷新时间表。
主要目标是建立一个 “精益” 刷新操作,尽可能多,这将有望导致刷新,这将花费最少的时间 (尽可能多,尽管由于SQL查询的性质,一些刷新将花费更长的时间等)。
在阅读DBMS_MVIEW.REFRESH的11.2文档后,它提到设置参数atomic_refresh => FALSE将负责 (a) 禁用,(b) 重建和 (c) 仅计算唯一索引的统计信息。
这是否意味着对于MV上存在的所有 “其他” 索引类型,例如位图和非唯一,我必须手动:-
(a) 在运行DBMS_MVIEW.REFRESH之前,禁用所有位图和非唯一索引 (忽略唯一索引),
(b) 使用参数运行DBMS_MVIEW.REFRESHmethod => 'C'和atomic_refresh => FALSE,
(c) Rebuild all BITMAP和NON-UNIQUE indexes (hoping the UNIQUE indexes will be re-built in the step above),
(d) 收集表统计信息,以计算表以及所有索引的统计信息。
感谢任何建议 :)
专家解答
不,Oracle数据库刷新非唯一索引,并通过非原子刷新收集统计信息:
就使您的刷新速度更快而言,如果您可以定期进行快速刷新,则值得研究。你必须和工会一起去彻底刷新。但是你可以用union all快速刷新。(只需确保您添加了标记列:https://jonathanlewis.wordpress.com/2016/07/12/union-all-mv/)
所以你可以:
-创建快速刷新联合所有MV
-在此之上的完整刷新MV返回不同的行
如果两个表的交集为 “小”,这可能会有所帮助。如果是这样,则独特的MV处理的数据将少得多 => 它将更快。
create table t2 ( x , y) as
select rownum x, mod(rownum, 5) y from dual connect by level <= 1000;
create table t1 ( x , y) as
select rownum x, mod(rownum, 3) y from dual connect by level <= 1000;
create materialized view mv_name
refresh on demand
as
select t1.* from t1
union
select t2.* from t2;
create index iy on mv_name(y);
select status, num_rows from user_indexes
where index_name = 'IY';
STATUS NUM_ROWS
VALID 1,800
insert into t1
select rownum+1000 x, mod(rownum, 3) y from dual connect by level <= 1000;
insert into t2
select rownum+1000 x, mod(rownum, 5) y from dual connect by level <= 1000;
commit;
exec dbms_mview.refresh('mv_name', atomic_refresh => false);
select status, num_rows from user_indexes
where index_name = 'IY';
STATUS NUM_ROWS
VALID 3,600
select count(*) from mv_name;
COUNT(*)
3,600
就使您的刷新速度更快而言,如果您可以定期进行快速刷新,则值得研究。你必须和工会一起去彻底刷新。但是你可以用union all快速刷新。(只需确保您添加了标记列:https://jonathanlewis.wordpress.com/2016/07/12/union-all-mv/)
所以你可以:
-创建快速刷新联合所有MV
-在此之上的完整刷新MV返回不同的行
如果两个表的交集为 “小”,这可能会有所帮助。如果是这样,则独特的MV处理的数据将少得多 => 它将更快。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




