楼主: ccsnmoracle

关于建立物化视图日志的疑问

[复制链接]
招聘 : Linux运维
论坛徽章:
235
紫蜘蛛
日期:2007-09-26 17:05:46玉兔
日期:2007-09-26 17:05:05现任管理团队成员
日期:2011-05-07 01:45:08玉兔
日期:2006-08-29 20:38:48紫蜘蛛
日期:2007-09-26 17:05:34阿斯顿马丁
日期:2013-11-19 10:38:16奔驰
日期:2013-10-16 09:08:58红旗
日期:2014-01-09 11:57:39路虎
日期:2013-08-13 14:52:35林肯
日期:2015-05-19 13:01:16
11#
发表于 2012-4-25 12:46 | 只看该作者
比如:杨版主的一篇文章
http://yangtingkun.itpub.net/post/468/20498

使用道具 举报

回复
论坛徽章:
9
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522010广州亚运会纪念徽章:击剑
日期:2010-11-03 11:00:36ITPUB十周年纪念徽章
日期:2011-11-01 16:25:512012新春纪念徽章
日期:2012-01-04 11:56:19奥运会纪念徽章:摔跤
日期:2012-08-21 10:04:04优秀写手
日期:2014-02-15 06:00:132014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08马上加薪
日期:2014-05-19 11:17:08
12#
 楼主| 发表于 2012-4-25 12:50 | 只看该作者
CHANGE_VECTOR$$                                    RAW(255)
XID$$                                              NUMBER

我觉得是这两个列起作用!
会不会是通过去查找redo和undo的信息呢??但是效率太低了吧!

使用道具 举报

回复
论坛徽章:
9
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522010广州亚运会纪念徽章:击剑
日期:2010-11-03 11:00:36ITPUB十周年纪念徽章
日期:2011-11-01 16:25:512012新春纪念徽章
日期:2012-01-04 11:56:19奥运会纪念徽章:摔跤
日期:2012-08-21 10:04:04优秀写手
日期:2014-02-15 06:00:132014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08马上加薪
日期:2014-05-19 11:17:08
13#
 楼主| 发表于 2012-4-25 12:57 | 只看该作者
SQL> delete from sales_bak where prod_id = 136;

710 rows deleted.

SQL>
SQL>
SQL> commit;

Commit complete.

SQL>
SQL> select count(*) from MLOG$_SALES_BAK;

  COUNT(*)
----------
       710

你看每行都有相应的记录,但是到底修改了什么?log表中没有明确的记录。

使用道具 举报

回复
论坛徽章:
9
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522010广州亚运会纪念徽章:击剑
日期:2010-11-03 11:00:36ITPUB十周年纪念徽章
日期:2011-11-01 16:25:512012新春纪念徽章
日期:2012-01-04 11:56:19奥运会纪念徽章:摔跤
日期:2012-08-21 10:04:04优秀写手
日期:2014-02-15 06:00:132014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08马上加薪
日期:2014-05-19 11:17:08
14#
 楼主| 发表于 2012-4-25 13:09 | 只看该作者
myfriend2010 发表于 2012-4-25 12:46
比如:杨版主的一篇文章
http://yangtingkun.itpub.net/post/468/20498

你看连杨版主,也是定义成这样的log 表!
SQL> desc mlog$_t_rowid
名称                                    是否为空? 类型
--------------------------------------- -------- -------------
NAME                                             VARCHAR2(30)    《--这里是可以记录历史数据的
NUM                                              NUMBER              《--这里是可以记录历史数据的
M_ROW$$                                          VARCHAR2(255)
SEQUENCE$$                                       NUMBER
SNAPTIME$$                                       DATE
DMLTYPE$$                                        VARCHAR2(1)
OLD_NEW$$                                        VARCHAR2(1)
CHANGE_VECTOR$$                                  RAW(255)

使用道具 举报

回复
论坛徽章:
9
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522010广州亚运会纪念徽章:击剑
日期:2010-11-03 11:00:36ITPUB十周年纪念徽章
日期:2011-11-01 16:25:512012新春纪念徽章
日期:2012-01-04 11:56:19奥运会纪念徽章:摔跤
日期:2012-08-21 10:04:04优秀写手
日期:2014-02-15 06:00:132014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08马上加薪
日期:2014-05-19 11:17:08
15#
 楼主| 发表于 2012-4-25 13:10 | 只看该作者
第一种是建立在整张表上,如 create materialized view log on sales_bak with rowid,sequence;


第二种是制定表上具体的列,如
CREATE MATERIALIZED VIEW LOG ON sales WITH SEQUENCE, ROWID
(prod_id, cust_id, time_id, channel_id, promo_id, quantity_sold, amount_sold)
INCLUDING NEW VALUES;


观察这两种物化视图日的定义发现,

第一种,
SQL> desc mlog$_sales_bak;
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
M_ROW$$                                            VARCHAR2(255)
SEQUENCE$$                                         NUMBER
SNAPTIME$$                                         DATE
DMLTYPE$$                                          VARCHAR2(1)
OLD_NEW$$                                          VARCHAR2(1)
CHANGE_VECTOR$$                                    RAW(255)
XID$$                                              NUMBER


第二种,
23:11:46 SQL> desc mlog$_sales;
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
PROD_ID                                            NUMBER
CUST_ID                                            NUMBER
TIME_ID                                            DATE
CHANNEL_ID                                         NUMBER
PROMO_ID                                           NUMBER
QUANTITY_SOLD                                      NUMBER(10,2)
AMOUNT_SOLD                                        NUMBER(10,2)
M_ROW$$                                            VARCHAR2(255)
SEQUENCE$$                                         NUMBER
SNAPTIME$$                                         DATE
DMLTYPE$$                                          VARCHAR2(1)
OLD_NEW$$                                          VARCHAR2(1)
CHANGE_VECTOR$$                                    RAW(255)
XID$$                                              NUMBER


我的疑问是,如 create materialized view log on sales_bak with rowid,sequence;这种方式建立的日志,是如何记录那些被修改的列呢??
SQL> desc mlog$_sales_bak;
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
M_ROW$$                                            VARCHAR2(255)
SEQUENCE$$                                         NUMBER
SNAPTIME$$                                         DATE
DMLTYPE$$                                          VARCHAR2(1)
OLD_NEW$$                                          VARCHAR2(1)
CHANGE_VECTOR$$                                    RAW(255)
XID$$                                              NUMBER


这里面根本就没有任何列的信息呀??那么这个日志是怎样起到日志做用呢?

使用道具 举报

回复
论坛徽章:
9
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522010广州亚运会纪念徽章:击剑
日期:2010-11-03 11:00:36ITPUB十周年纪念徽章
日期:2011-11-01 16:25:512012新春纪念徽章
日期:2012-01-04 11:56:19奥运会纪念徽章:摔跤
日期:2012-08-21 10:04:04优秀写手
日期:2014-02-15 06:00:132014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08马上加薪
日期:2014-05-19 11:17:08
16#
 楼主| 发表于 2012-4-25 13:19 | 只看该作者
本帖最后由 ccsnmoracle 于 2012-4-25 13:23 编辑

re: 心中的疑问 [回复]

我问个没水平的问题,实体化视图日志中又没有记录主表某个字段更改前的值和更改后的值,Oracle是如何正确的刷新呢?
空虚的猫 评论于: 2007.09.19 10:38

re: 物化视图日志结构 [回复]

Oracle要读基表的
yangtingkun 评论于: 2007.09.19 14:27


如果没有理解错的话,按照杨版主的说法,那就是去读基表了!

通过直接读取基表来获取当前的信息,然后再去更新物化视图。但是这么做的话,refresh时的工作量好大呀!


使用道具 举报

回复
招聘 : Linux运维
论坛徽章:
235
紫蜘蛛
日期:2007-09-26 17:05:46玉兔
日期:2007-09-26 17:05:05现任管理团队成员
日期:2011-05-07 01:45:08玉兔
日期:2006-08-29 20:38:48紫蜘蛛
日期:2007-09-26 17:05:34阿斯顿马丁
日期:2013-11-19 10:38:16奔驰
日期:2013-10-16 09:08:58红旗
日期:2014-01-09 11:57:39路虎
日期:2013-08-13 14:52:35林肯
日期:2015-05-19 13:01:16
17#
发表于 2012-4-25 13:25 | 只看该作者
er...看明白你的意思了,你是要得到那些列有修改!这个除在定义日志时指明那些列

我觉得物化视图,很可能不是你想象的样子,oracle物化视图,不用关心都有那些列做了修改,他的核心是,记录那些行做了修改,然后根据修改的过程,把数据重演到目标数据库中!而记录那些行被修改用简单的(rowid/primary key)就足够了,所以简单的物化视图,oracle只要你有primary或者rowid中的任何一个就可以。

当然(根据业务需要)你也可以定制其他的列进去,但是这个不影响物化视图的数据刷新,这就是第二种方法了,你可以注意到,在日志表中只是增加了一些列进去,别的没有很大变化,就这样...

使用道具 举报

回复
论坛徽章:
9
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522010广州亚运会纪念徽章:击剑
日期:2010-11-03 11:00:36ITPUB十周年纪念徽章
日期:2011-11-01 16:25:512012新春纪念徽章
日期:2012-01-04 11:56:19奥运会纪念徽章:摔跤
日期:2012-08-21 10:04:04优秀写手
日期:2014-02-15 06:00:132014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08马上加薪
日期:2014-05-19 11:17:08
18#
 楼主| 发表于 2012-4-25 13:27 | 只看该作者
第一种是建立在整张表上,如 create materialized view log on sales_bak with rowid,sequence;


第二种是制定表上具体的列,如
CREATE MATERIALIZED VIEW LOG ON sales WITH SEQUENCE, ROWID
(prod_id, cust_id, time_id, channel_id, promo_id, quantity_sold, amount_sold)
INCLUDING NEW VALUES;


如果是使用第二种方式建立log的话,是不是就不用去读原表了呢???只是看log就可以??

使用道具 举报

回复
招聘 : Linux运维
论坛徽章:
235
紫蜘蛛
日期:2007-09-26 17:05:46玉兔
日期:2007-09-26 17:05:05现任管理团队成员
日期:2011-05-07 01:45:08玉兔
日期:2006-08-29 20:38:48紫蜘蛛
日期:2007-09-26 17:05:34阿斯顿马丁
日期:2013-11-19 10:38:16奔驰
日期:2013-10-16 09:08:58红旗
日期:2014-01-09 11:57:39路虎
日期:2013-08-13 14:52:35林肯
日期:2015-05-19 13:01:16
19#
发表于 2012-4-25 13:32 | 只看该作者
物化视图日志不是为了记录历史数据,而是想根据业务操作过程,把数据同步到物化视图表中!我个人认为,在日志表中记录历史数据的那些列,对于物化视图表内部数据同步来说是没有任何意思的!你想要加就加,不加也没关系,它先根据原表找到主键,再根据主键将目标表的数据改成和原表一致,仅此而已!

使用道具 举报

回复
论坛徽章:
9
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522010广州亚运会纪念徽章:击剑
日期:2010-11-03 11:00:36ITPUB十周年纪念徽章
日期:2011-11-01 16:25:512012新春纪念徽章
日期:2012-01-04 11:56:19奥运会纪念徽章:摔跤
日期:2012-08-21 10:04:04优秀写手
日期:2014-02-15 06:00:132014年新春福章
日期:2014-02-18 16:44:08马上有对象
日期:2014-02-18 16:44:08马上加薪
日期:2014-05-19 11:17:08
20#
 楼主| 发表于 2012-4-25 13:34 | 只看该作者
myfriend2010 发表于 2012-4-25 13:25
er...看明白你的意思了,你是要得到那些列有修改!这个除在定义日志时指明那些列

我觉得物化视图,很可能 ...

其实我就是想知道,是如何利用log表中的记录来更新物化视图。

我现在得到的答案可能就是,如果是第一种建立log的方法,那么就必须去读基表。以为log中准确的记录了,哪一行的哪一个列做了怎样的操作,只需要在基表中把当前的值拿到就好了,就可以去更新物化视图了!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表