物化视图 物化视图多用于数据仓库,是一种特殊的物理表,“物化”(Materialized)视图是相对普 通视图而言的。普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际 上转换为视图SQL语句的查询。这样对整体查询性能的提高,并没有实质上的好处。 而物化视图是包括一个查询结果的数据库对象,它是远程数据的的本地副本,或者用来 生成基于数据表求和的汇总表 ()物化视图在某种意义上说就是一个物理表(而且不仅仅是一个物理表),这通过其可 以被user_tables查询出来,而得到佐证 (2)物化视图也是一种段(segment)),所以其有自己的物理存储属性: (3)物化视图会占用数据库磁盘空间,从user_segment的查询结果可以得到佐证 create materialized view materialized view name build immediate|deferred -1.物化视图生成的方式 refresh[complete|fast|force|never]-2.物化视图刷新方式 on commit I demand -3.刷新触发方式 start with(start_date) -4.开始时间 next(interval date) -5.间隔时间 with [primary key rowid -6.默认primary key ENABLE QUERY REWRITE -7.是否启用查询重写 as -8.关键字 select statement; -9.基表选取数据的select语句 一、物化视图生成数据的方式 1.BUILD IMMEDIATE (DEFAULT) 在创建物化视图的同时根据主表生成数据。 2.BUILD DEFERRED 在创建物化视图的同时不生成数据,直到第一次刷新时才生成数据。 EXEC DBMS_.MVIEW.Refresh(N_name',C),注意必须使用全量刷新,默认是增量 刷新,所以这里参数必须是C,因为之前都没有生成数据,所以必须全量。 ?表示强制force C或c表示complete F或f表示fast
物化视图 物化视图多用于数据仓库,是一种特殊的物理表,“物化”(Materialized)视图是相对普 通视图而言的。普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle 都实际 上转换为视图 SQL 语句的查询。这样对整体查询性能的提高,并没有实质上的好处。 而物化视图是包括一个查询结果的数据库对象,它是远程数据的的本地副本,或者用来 生成基于数据表求和的汇总表。 (1) 物化视图在某种意义上说就是一个物理表(而且不仅仅是一个物理表),这通过其可 以被 user_tables 查询出来,而得到佐证; (2) 物化视图也是一种段(segment),所以其有自己的物理存储属性; (3) 物化视图会占用数据库磁盘空间,从 user_segment 的查询结果可以得到佐证。 create materialized view materialized_view_name build [ immediate | deferred ] --1.物化视图生成的方式 refresh [ complete | fast | force | never ]--2.物化视图刷新方式 on [ commit | demand ] --3.刷新触发方式 start with (start_date) --4.开始时间 next (interval_date) --5.间隔时间 with [primary key | rowid ] --6.默认 primary key ENABLE QUERY REWRITE --7.是否启用查询重写 as --8.关键字 select statement; --9.基表选取数据的 select 语句 一、物化视图生成数据的方式 1.BUILD IMMEDIATE(DEFAULT) 在创建物化视图的同时根据主表生成数据。 2.BUILD DEFERRED 在创建物化视图的同时不生成数据,直到第一次刷新时才生成数据。 EXEC DBMS_MVIEW.Refresh(‘MV_name’,’C’),注意必须使用全量刷新,默认是增量 刷新,所以这里参数必须是 C,因为之前都没有生成数据,所以必须全量。 ?表示强制 force C 或 c 表示 complete F 或 f 表示 fast
二、物化视图的类型 包含聚集的物化视图、只包含连接的物化视图、嵌套物化视图。 三种物化视图的快速刷新的限制条件有很大区别,而对于其他方面则区别不大。创建物 化视图时可以指定多种选项。 三、物化视图刷新的方式 1.COMPLETE 完全刷新整个物化视图,相当于重新生成物化视图。 即使此时增量刷新可用,也将全量刷新。 2.FAST 当有数据更新时,依照相应的规则对物化视图进行更新,采取增量刷新机制(此时必须 创建物化视图日志,物化视图日志记录了数据的更新)。 3.FORCE (DEFAULT) 当增量刷新可用时进行增量刷新,增量刷新不可用时进行全量刷新 4.NEVER 从不刷新。 显然快速刷新是物化视图刷新方式的首选。但是,不是所有的物化视图都可 以进行快速刷新,只有满足某些条件的物化视图才具有快速刷新的能力。 所有类型的快速刷新物化视图都必须满足的条件: 1.物化视图不能包含对不重复表达式的引用,如SYSDATE和ROWNUM: 2.物化视图不能包含对LONG和LONG RAW数据类型的引用 只包含连接的物化视图: 1,必须满足所有快速刷新物化视图都满足的条件: 2.不能包括GROUP BY语句或聚集操作: 3.如果在HERE语句中包含外连接,那么唯一约束必须存在于连接中内表的连接列 上: 4.如果不包含外连接,那么WHERE语句没有限制,如果包含外连接,那么WHERE 语句中只能使用AND连接,并且只能使用°="操作。 5.FROM语句列表中所有表的ROWID必须出现在SELECT语句的列表中. 6.FROM语句列表中的所有表必须建立基于ROWID类型的物化视图日志
二、物化视图的类型 包含聚集的物化视图、只包含连接的物化视图、嵌套物化视图。 三种物化视图的快速刷新的限制条件有很大区别,而对于其他方面则区别不大。创建物 化视图时可以指定多种选项。 三、物化视图刷新的方式 1.COMPLETE 完全刷新整个物化视图,相当于重新生成物化视图。 即使此时增量刷新可用,也将全量刷新。 2.FAST 当有数据更新时,依照相应的规则对物化视图进行更新,采取增量刷新机制(此时必须 创建物化视图日志,物化视图日志记录了数据的更新)。 3.FORCE(DEFAULT) 当增量刷新可用时进行增量刷新,增量刷新不可用时进行全量刷新。 4.NEVER 从不刷新。 显然快速刷新是物化视图刷新方式的首选。但是,不是所有的物化视图都可 以进行快速刷新,只有满足某些条件的物化视图才具有快速刷新的能力。 所有类型的快速刷新物化视图都必须满足的条件: 1.物化视图不能包含对不重复表达式的引用,如 SYSDATE 和 ROWNUM; 2.物化视图不能包含对 LONG 和 LONG RAW 数据类型的引用。 只包含连接的物化视图: 1.必须满足所有快速刷新物化视图都满足的条件; 2.不能包括 GROUP BY 语句或聚集操作; 3.如果在 WHERE 语句中包含外连接,那么唯一约束必须存在于连接中内表的连接列 上; 4.如果不包含外连接,那么 WHERE 语句没有限制,如果包含外连接,那么 WHERE 语句中只能使用 AND 连接,并且只能使用“=”操作。 5.FROM 语句列表中所有表的 ROWID 必须出现在 SELECT 语句的列表中。 6.FROM 语句列表中的所有表必须建立基于 ROWID 类型的物化视图日志
四、物化视图刷新的触发方式 1.ON DEMAND 仅在物化视图“需要”被刷新时才刷新。使用dbms_mview包刷新。 2.ON COMMIT 一旦基表有了事务提交,立刻刷新物化视图,使物化视图和基表数据一致。 但是不能跨库执行。(不知道别的库的提交动作) 五、物化视图的时间 1.START WITH刷新的开始时间 指定首次刷新的时间(一般指定的是当前时间,不过也可以在创建物化视图时不生成数 据,则可以考虑在指定的时间刷新,从而生成数据) 2.NEXT刷新的时间间隔 刷新的周期时间 start with sysdate next sysdate+1/1440 表示马上开始,刷新间隔为1分钟。(与on commit选项冲突) 六、物化视图基于的条件 1.WITH PRIMARY KEY 生成主键物化视图,也就是说物化视图是基于表的主键,而不是ROWID(对应于ROWD 子)。为了生成PRIMARY KEY子句,应该在表上定义主键,否则应该用基于ROWID 的物化视图。主键物化视图允许识别物化视图表而不影响物化视图增量刷新的可用性 2.WITH ROWID 基于rowid,不能对基表执行分组函数、多表连结等需要把多个rowid合成一行的操作 (理由很简单:到底以哪个rowid为准呢?) 只有一个单一的主表,不能包括下面任何一项: Distinct 聚合函数 Group by 子查询 。连接 ·SET操作
四、物化视图刷新的触发方式 1.ON DEMAND 仅在物化视图“需要”被刷新时才刷新。使用 dbms_mview 包刷新。 2.ON COMMIT 一旦基表有了事务提交,立刻刷新物化视图,使物化视图和基表数据一致。 但是不能跨库执行。(不知道别的库的提交动作) 五、物化视图的时间 1.START WITH 刷新的开始时间 指定首次刷新的时间(一般指定的是当前时间,不过也可以在创建物化视图时不生成数 据,则可以考虑在指定的时间刷新,从而生成数据) 2.NEXT 刷新的时间间隔 刷新的周期时间 start with sysdate next sysdate+1/1440 表示马上开始,刷新间隔为 1 分钟。(与 on commit 选项冲突) 六、物化视图基于的条件 1.WITH PRIMARY KEY 生成主键物化视图,也就是说物化视图是基于表的主键,而不是 ROWID(对应于 ROWID 子句)。 为了生成 PRIMARY KEY 子句,应该在表上定义主键,否则应该用基于 ROWID 的物化视图。主键物化视图允许识别物化视图表而不影响物化视图增量刷新的可用性 2.WITH ROWID 基于 rowid,不能对基表执行分组函数、多表连结等需要把多个 rowid 合成一行的操作 (理由很简单:到底以哪个 rowid 为准呢?) 只有一个单一的主表,不能包括下面任何一项: • Distinct • 聚合函数 • Group by • 子查询 • 连接 • SET 操作
七、查询重写 如果设置了初始化参数query_.rewrite_.enabled=-true则默认就会启用查询重写。但是, 数据库默认该参数为fse。并且,不是什么时候都应该启用查询重写。所以,该参数应该 设置为flse,而在创建特定物化视图时,根据需要开启该功能。 另外,如果选择使用了上面起始时间和间隔时间,则不支持查询重写功能(原因很简单, 所谓重写,就是将对基表的查询定位到了物化视图上,而设定起始时间和间隔时间会造成物 化视图上部分数据延迟,所以,不能重写)。 1.ENABLE QUERY REWRITE 启用查询重写。查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否 通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从己经计算好 的物化视图中读取数据。 2.DISABLE QUERY REWRITE (DEFAULT) 禁用查询重写。 八、ORDER BY 在建立物化视图的时候可以指定ORDER BY语句,使生成的数据按照一定的顺序进行保 存。不过这个语句不会写入物化视图的定义中,而且对以后的刷新也无效。 九、物化视图日志 如果需要进行快速刷新,则需要建立物化视图日志。物化视图日志根据不同物化视图的 快速刷新的需要,可以建立为ROWID或PRIMARY KEY类型的。还可以选择是否包括 SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。 可以指明ON PREBUILD TABLE语句将物化视图建立在一个已经存在的表上。这种情况下, 物化视图和表必须同名。当别除物化视图时,不会删除同名的表。这种物化视图的查询重写 要求参数QUERY_REWRITE_INTEGERITY必须设置为trusted或者stale_tolerated
七、查询重写 如果设置了初始化参数 query_rewrite_enabled=true 则默认就会启用查询重写。但是, 数据库默认该参数为 false。并且,不是什么时候都应该启用查询重写。所以,该参数应该 设置为 false,而在创建特定物化视图时,根据需要开启该功能。 另外,如果选择使用了上面起始时间和间隔时间,则不支持查询重写功能(原因很简单, 所谓重写,就是将对基表的查询定位到了物化视图上,而设定起始时间和间隔时间会造成物 化视图上部分数据延迟,所以,不能重写)。 1.ENABLE QUERY REWRITE 启用查询重写。查询重写是指当对物化视图的基表进行查询时,Oracle 会自动判断能否 通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好 的物化视图中读取数据。 2.DISABLE QUERY REWRITE(DEFAULT) 禁用查询重写。 八、ORDER BY 在建立物化视图的时候可以指定 ORDER BY 语句,使生成的数据按照一定的顺序进行保 存。不过这个语句不会写入物化视图的定义中,而且对以后的刷新也无效。 九、物化视图日志 如果需要进行快速刷新,则需要建立物化视图日志。物化视图日志根据不同物化视图的 快速刷新的需要,可以建立为 ROWID 或 PRIMARY KEY 类型的。还可以选择是否包括 SEQUENCE、INCLUDING NEW VALUES 以及指定列的列表。 可以指明 ON PREBUILD TABLE 语句将物化视图建立在一个已经存在的表上。这种情况下, 物化视图和表必须同名。当删除物化视图时,不会删除同名的表。这种物化视图的查询重写 要求参数 QUERY_REWRITE_INTEGERITY 必须设置为 trusted 或者 stale_tolerated