物化视图 - Oracle

Posted

技术标签:

【中文标题】物化视图 - Oracle【英文标题】:Materialized View - Oracle 【发布时间】:2011-12-08 23:03:28 【问题描述】:

我有想要更改其刷新时间的物化视图:

REFRESH FORCE START WITH SYSDATE NEXT SYSDATE +1 DISABLE QUERY REWRITE

我想知道这方面的一些事情。

    NEXT SYSDATE +1 描述了什么(我将如何改变它) 什么是禁用查询重写 换句话说,就物化视图而言,DISABLE QUERY REWRITE 与 ENABLE QUERY REWRITE 对比。

【问题讨论】:

这对dba.stackexchange.com 来说是一个很好的问题,但我不知道如何投票才能搬到那里(这不是一个选项)。 【参考方案1】:

oracle 中的物化视图支持称为查询重写的功能。这意味着数据库可以分析对基表的特定查询,决定是否从物化视图返回相同的结果,并查询 MV 而不是基表。在某些情况下,这可能是一个很好的优化。告诉 oracle 禁用查询重写意味着放弃这种潜在的优化,并且始终查询基表,即使对 MV 的查询会返回相同的数据。

例如:

create materialized view emp_salary
  refresh fast on commit
  as
     select first_name, last_name, salary
     from employee, pay_rate
     where employee.id = pay_rate.employee_id
;

然后执行查询:

     select last_name, salary
     from employee, pay_rate
     where employee.id = pay_rate.employee_id

查询引擎可以采用上面的常规选择语句,并直接从物化视图中检索数据,而不必进行可能代价高昂的连接(因为连接已经由 MV 完成)。这是查询重写。

This question 描述了with sysdate next 子句的作用。显然,它告诉数据库下一次刷新日期将在 1 天后(sysdate +1)。

【讨论】:

但是,如果我查询“select * from emp_salary”,它会带来与“select last_name,salary from employee,pay_rate where employee.id = pay_rate.employee_id”相同的结果,甚至不启用查询重写。 @ShahJee 正确,但是您需要更改所有应用程序代码以使用新的物化视图。查询重写允许您的应用程序在不更改应用程序的情况下执行更有效的查询。这样,没有人需要知道MV。他们只是坐在那里,在适当的时候被使用。 DBA 现在可以编写应用程序可以使用的更高效的查询,甚至不知道它们是否存在。【参考方案2】:

物化视图的主要优点之一是能够使用查询重写...不太确定为什么要禁用查询重写。

查询重写允许使用物化视图而不是实际的详细信息表。

oracle 使用 NEXT 值来确定第一次自动刷新。因此在您的示例中,它将在创建后 1 天第一次刷新,并从那时起每天刷新。

更改为 SYSDATE + 6/24 以每 6 小时运行一次!

【讨论】:

如果我想将刷新时间更改为 6 小时,那么语法是什么。 我认为你可以只做 sysdate + 6/24 而不是 sysdate + 1

以上是关于物化视图 - Oracle的主要内容,如果未能解决你的问题,请参考以下文章

如何获得oracle物化视图 定时刷新时 刷新所用的时间 或者是监控 物化视图在jobs中建立的job任务的执行时间

Oracle物化视图梳理

Oracle 物化视图日志

Oracle 物化视图

Oracle性能优化之物化视图管理_超越OCP精通Oracle视频教程培训39

oracle物化视图