【发布时间】:2015-10-21 08:32:09
【问题描述】:
我们为什么要创建物化视图存在疑问。我有一个表并且要增量刷新表我有 dbms 作业,它将来自不同表的数据合并到这个表中。所以它相当于快速刷新的物化视图。有什么区别吗?以上两种情况哪个实现更好?
【问题讨论】:
-
哪个更好?使用数据库系统的内置功能(已经过广泛测试和调试)或编写代码(必须调试)来近似相同的功能?
-
使用内置功能更好。
我们为什么要创建物化视图存在疑问。我有一个表并且要增量刷新表我有 dbms 作业,它将来自不同表的数据合并到这个表中。所以它相当于快速刷新的物化视图。有什么区别吗?以上两种情况哪个实现更好?
【问题讨论】:
实体化视图可以按需或按刷新频率刷新。它可以由两个或多个表的连接组成。
创建实体化视图时,您可以选择指定刷新发生在 ON DEMAND 还是 ON COMMIT。在 ON COMMIT 的情况下,每次事务提交时都会更改物化视图,从而确保物化视图始终包含最新数据。或者,您可以通过指定 ON DEMAND 来控制刷新实体化视图的时间。在 ON DEMAND 物化视图的情况下,可以使用 DBMS_SYNC_REFRESH 或 DBMS_MVIEW 包中提供的刷新方法执行刷新:
这是link的文档
物化视图也可以增量刷新。
您的自定义解决方案
需要大量代码并且不能很好地扩展。
【讨论】:
certain conventions 之后的实体化视图可以使用实体化视图日志快速刷新。这意味着 Oracle 只需处理实际更改即可刷新物化视图,合并操作每次都必须比较所有行。因此,物化视图将允许更快和更频繁的刷新,尤其是对于较大的表。
【讨论】:
经过大量搜索后,我在物化视图上得到了一些我们在普通表上无法做到的东西,它是查询重写。以下是我的发现。
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 |
您可以在上面的示例中看到如何使用物化视图而不是再次扫描整个表。
【讨论】: