设为首页 加入收藏

TOP

DB2物化查询表(MQT)刷新机制(二)
2014-11-23 22:04:35 来源: 作者: 【 】 浏览:36
Tags:DB2 物化 查询表 MQT 新机制
Subquery predicate ID: Not Applicable
Column Names:
------------
+Q6.$C0+Q6.$C1+Q6.$C2
在清单 3 的访问方案中我们可以看到,DB2 数据库管理器在执行这条 insert 语句的时候,不但向基表 basetable 中插入了数据(INSERT 操作符 3),而且同时向 MQT mqttab 执行了插入操作(INSERT 操作符 2),这就充分说明了采用即时刷新方式时对 MQT 的刷新是与基表的操作同时完成的。另外在 INSERT 操作符 2 的 detail 中可以看到 Estimated number of rows: 1,说明对于 MQT 的刷新是增量刷新。
需要提醒一下的是,由于是在 explain mode 下使用了插入操作,但实际上该插入操作并没有真正执行而只是生成了访问方案,所以如果此时查询 MQT 会发现无法找到这条新数据,下文中的各项操作都是与此类的情况。
接下来我们来看对基表的 update 和 delete 操作时的访问方案,使用的命令如清单 4 所示。
清单 4. 基表的 update 和 delete 操作
db2 set current explain mode explain
db2 "update basetable set c2=100 where c1=11"
db2exfmt -d MYDB -1 -e -o update1.exfmt
db2 "delete from basetable where c1=11"
db2exfmt -d MYDB -1 -e -o delete1.exfmt
db2 set current explain mode no
观察对基表的 update 和 delete 操作时的访问方案,我们会发现与清单 3 中 insert 操作时的访问方案相似,都是在对基表完成 update 或 delete 操作的同时相应的完成对 MQT 的刷新操作。读者可以在本文最后的 下载链接中找到 update1.exfmt 和 delete1.exfmt 中的访问方案,限于篇幅不在正文部分显示。
最后,我们来看一下当用户手动的刷新 MQT 时其执行方案,使用的命令和访问方案如清单 5 所示。
清单 5. 手动刷新采用即时更新方式的 MQT
db2 set current explain mode explain
db2 "refresh table mqttab"
db2exfmt -d MYDB -1 -e -o refresh1.exfmt
db2 set current explain mode no
Rows
RETURN
( 1)
Cost
I/O
|
1
TBSCAN
( 2)
0.0048
0
|
1
TABFNC: SYSIBM
GENROW
在清单 5 的执行计划可以看到,对于采用即时刷新方式的 MQT,当用户手动刷新时并没有对该 MQT 进行任何操作。访问方案中的 SYSIBM.GENROW 是一个内置函数,它可生成行的表而不使用任何输入,它可以用来生成数据行,然后 TBSCAN 操作符读取数据行。
至此,我们已经通过访问方案理解了 MQT 的即时刷新方式,接下来我们继续讨论 MQT 的延迟刷新方式。
REFRESH DEFERRED 方式(无登台表,即完全刷新)
创建一个基表并插入若干数据,然后创建一个延迟刷新的 MQT,这里基表和 MQT 的表结构与之前的相同,这样也便于我们比较不同刷新方式的异同。使用的语句如清单 6 所示。
清单 6. 创建延迟刷新的 MQT
create table basetab2
(c1 int not null primary key, c2 int, c3 int, c4 int);
insert into basetab2
values(1,1,1,1),(2,2,2,2),(3,3,3,3),(11,11,11,11);
create table mqttab2 as
(select c1, c2, c3 from basetab2 where c1 > 10)
data initially deferred refresh deferred;
set integrity for mqttab2 immediate checked not incremental
本文开始部分提到,对于延迟刷新方式,当对基表进行任何 insert/update/delete 等操作时,MQT 中的数据没有进行相应的刷新,而是等到用户手动的执行刷新命令时才进行刷新。现在我们设置 CURRENT EXPLAIN MODE,并向基表 basetab2 中插入一条数据,查看其访问方案,使用的命令及得到的访问方案如清单 7 所示。
清单 7. 基表的 insert 操作时的访问方案
db2 set current explain mode explain
db2 "insert into basetab2 values(12,12,12,12)"
db2exfmt -d MYDB -1 -e -o insert2.exfmt
db2 set current explain mode no
Rows
RETURN
( 1)
Cost
I/O
|
1
INSERT
( 2)
8.0848
1
/---+---\
1 4
TBSCAN TABLE: HQY
( 3) BASETAB2
0.0048 Q3
0
|
1
TABFNC: SYSIBM
GENROW
我们发现清单 7 中访问方案就是一个普通的 insert 操作,只对基表 basetab2 进行了插入操作,并没有对 MQT mqttab2 进行任何的操作,这就可以说明采用延迟更新方式的 MQT 在基表有变化时并没有即时刷新。
接下来我们来看对基表的 update 和 delete 操作时的访问方案,使用的命令如清单 8 所示。
清单 8. 基表的 update 和 delete 操作
db2 set current explain mode explain
db2 "update basetab2 set c2=100 where c1=11"
db2exfmt -d MYDB -1 -e -o update2.exfmt
db2 "delete from basetab2 where c1=11"
db2exfmt -d MYDB -1 -e -o delete2.exfmt
db2 set current exp
首页 上一页 1 2 3 4 5 下一页 尾页 2/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇使用DB2对象:创建模式、表和视图 下一篇DB2中包含BLOB字段表数据的导入导..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: