【问题标题】:Difference between materialised view and table which is refreshed incremental物化视图和增量刷新的表之间的区别
【发布时间】:2015-10-21 08:32:09
【问题描述】:

我们为什么要创建物化视图存在疑问。我有一个表并且要增量刷新表我有 dbms 作业,它将来自不同表的数据合并到这个表中。所以它相当于快速刷新的物化视图。有什么区别吗?以上两种情况哪个实现更好?

【问题讨论】:

  • 哪个更好?使用数据库系统的内置功能(已经过广泛测试和调试)或编写代码(必须调试)来近似相同的功能?
  • 使用内置功能更好。

标签: oracle materialized-views


【解决方案1】:

实体化视图可以按需或按刷新频率刷新。它可以由两个或多个表的连接组成。

创建实体化视图时,您可以选择指定刷新发生在 ON DEMAND 还是 ON COMMIT。在 ON COMMIT 的情况下,每次事务提交时都会更改物化视图,从而确保物化视图始终包含最新数据。或者,您可以通过指定 ON DEMAND 来控制刷新实体化视图的时间。在 ON DEMAND 物化视图的情况下,可以使用 DBMS_SYNC_REFRESH 或 DBMS_MVIEW 包中提供的刷新方法执行刷新:

这是link的文档

物化视图也可以增量刷新。

您的自定义解决方案

需要大量代码并且不能很好地扩展。

【讨论】:

  • 同意这一点,但这也可以用表格完成。我可以按计划运行 dbms 作业,也可以手动运行。或者在手动的情况下,我可以在 dbms 作业中执行 pl/sql 块来刷新表。因此,手动与物化视图中的按需相同。 ON COMMIT 的另一种情况,我可以通过 dbms_scheduler 安排 dbms 作业在提交时运行。
  • 关键是你为什么要编写自定义解决方案,如果有一个内置/测试的功能表现良好
  • 好的,但是我们不能在所有情况下都创建物化视图。如果我谈论性能,我不知道在哪种情况下哪个会表现得更好。
【解决方案2】:

certain conventions 之后的实体化视图可以使用实体化视图日志快速刷新。这意味着 Oracle 只需处理实际更改即可刷新物化视图,合并操作每次都必须比较所有行。因此,物化视图将允许更快和更频繁的刷新,尤其是对于较大的表。

【讨论】:

  • 好吧,这是一个区别,但“某些约定”或者我可以说“限制”太多了。在通过物化视图日志刷新时添加您的观点,更新是通过将数据库块从日志复制到表块来完成的。虽然 merge 是一个 DML ,但它将创建撤消空间,然后在触发提交块级操作后执行。在快速刷新的情况下,物化视图更好,那么完全刷新呢?在完全刷新的情况下,物化视图和截断加载表的情况是否相同?
【解决方案3】:

经过大量搜索后,我在物化视图上得到了一些我们在普通表上无法做到的东西,它是查询重写。以下是我的发现。

SQL> GRANT GLOBAL QUERY REWRITE to mydbdba;

SQL> CREATE MATERIALIZED VIEW customers_mw ENABLE QUERY REWRITE
AS
SELECT COUNT(*) c,state_id FROM sg.customers GROUP BY state_id;

SQL> alter session set QUERY_REWRITE_ENABLED=TRUE;

Session altered.

SQL> SELECT COUNT(*) c,state_id FROM sg.customers GROUP BY state_id;

Execution Plan

Plan hash value: 799451518


| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

| 0 | SELECT STATEMENT | | 52 | 364 | 3 (0)| 00:00:01 |
| 1 | MAT_VIEW REWRITE ACCESS FULL| CUSTOMERS_MW | 52 | 364 | 3 (0)| 00:00:01 |

SQL> alter session set QUERY_REWRITE_ENABLED=FALSE;

Session altered.

SQL> SELECT COUNT(*) c,state_id FROM sg.customers GROUP BY state_id;

Execution Plan

Plan hash value: 1577413243


| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

| 0 | SELECT STATEMENT | | 52 | 156 | 327 (1)| 00:00:01 |
| 1 | HASH GROUP BY | | 52 | 156 | 327 (1)| 00:00:01 |
| 2 | TABLE ACCESS FULL| CUSTOMERS | 50000 | 146K| 326 (1)| 00:00:01 |

您可以在上面的示例中看到如何使用物化视图而不是再次扫描整个表。

【讨论】:

    猜你喜欢
    • 2012-11-07
    • 2018-04-12
    • 2011-11-25
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 2010-09-27
    • 2020-12-03
    相关资源
    最近更新 更多