问题描述
你好,
我们所有的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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
598次阅读
2025-04-15 17:24:06
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
579次阅读
2025-04-18 14:18:38
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
493次阅读
2025-04-08 09:12:48
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
475次阅读
2025-04-20 10:07:02
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
460次阅读
2025-04-22 00:20:37
Oracle 19c RAC更换IP实战,运维必看!
szrsu
438次阅读
2025-04-08 23:57:08
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
436次阅读
2025-04-22 00:13:51
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
422次阅读
2025-04-17 17:02:24
火焰图--分析复杂SQL执行计划的利器
听见风的声音
368次阅读
2025-04-17 09:30:30
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
358次阅读
2025-04-15 14:48:05