有一个问题是我们为什么要创建物化视图。我有一个表,为了逐步刷新这个表,我有一个dbms作业,它将来自不同表的数据合并到这个表中。因此它等同于快速刷新物化视图。有什么不同吗?在上述两种情况下,哪种实现更好?
发布于 2015-07-30 06:12:16
可以按需刷新实体化视图,也可以按刷新频率刷新。它可以由两个或更多个表的联接组成。
创建实体化视图时,可以选择指定刷新是按需进行还是在提交时进行。在ON COMMIT的情况下,每次事务处理提交时,实体化视图都会更改,从而确保实体化视图始终包含最新数据。或者,您可以通过指定ON DEMAND来控制实体化视图的刷新时间。在按需实体化视图的情况下,可以使用DBMS_SYNC_REFRESH或DBMS_MVIEW程序包中提供的刷新方法执行刷新:
这是文档link
此外,可以增量地刷新实例化视图。
您的自定义解决方案
需要大量的代码,而且伸缩性不好。
发布于 2015-07-30 09:34:53
可以使用实体化视图日志对certain conventions之后的实体化视图进行快速刷新。这意味着Oracle只需处理实际更改即可刷新实体化视图,其中合并操作每次都必须比较所有行。因此,物化视图将允许更快、更频繁的刷新,尤其是对于较大的表。
发布于 2015-08-04 11:43:04
经过大量的搜索,我在物化视图上找到了一些我们在普通表上做不到的东西,那就是查询重写。下面是我的发现。
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 |
您可以在上面的示例中看到如何使用实例化视图,而不是再次扫描整个表。
https://stackoverflow.com/questions/31716063
复制