lain mode no
同样的我们可以发现,对基表的 update 和 delete 操作时的访问方案也没有对 MQT 的刷新操作。读者可以在本文最后的下载链接中找到 update2.exfmt 和 delete2.exfmt 中的访问方案,限于篇幅不在正文部分显示。
最后,我们来看一下当用户手动的刷新 MQT 时其执行方案,在刷新之前我们首先向基表中插入了几条数据并修改了部分已有数据,使用的命令和访问方案如清单 9 所示。
清单 9. 手动刷新采用延迟更新方式的 MQT
db2 "insert into basetab2 values(12,12,12,12)"
db2 "insert into basetab2 values(13,12,12,12)"
db2 "insert into basetab2 values(14,12,12,12)"
db2 "insert into basetab2 values(15,12,12,12)"
db2 "update basetab2 set c2=100 where c1=11"
db2 runstats on table hqy.basetab2
db2 set current explain mode explain
db2 "refresh table mqttab2"
db2exfmt -d MYDB -1 -e -o refresh2.exfmt
db2 set current explain mode no
Rows
RETURN
( 1)
Cost
I/O
|
0.333333
FILTER
( 2)
35.9682
4
+------------+------------------+-----+-------------------------+
1 0 1.33333 1
TBSCAN FILTER INSERT DELETE
( 3) ( 4) ( 6) ( 9)
0.0048 0.0404 17.979 17.8015
0 0 2 2
| | /---+----\ /---+----\
1 1 1.33333 1 1 1
TABFNC: SYSIBM TBSCAN FETCH TABLE: HQY TBSCAN TABLE: HQY
GENROW ( 5) ( 7) MQTTAB2 ( 10) MQTTAB2
0.0048 9.89896 Q6 9.72148 Q10
0 1 1
| /---+----\ |
1 1.33333 4 1
TABFNC: SYSIBM IXSCAN TABLE: HQY TABLE: HQY
GENROW ( 8) BASETAB2 MQTTAB2
1.73403 Q7 Q11
0
|
4
INDEX: SYSIBM
SQL091124002956410
Q7
在清单 11 中我们得到了一个与清单 5 中完全不同而且比较复杂的访问方案,在本文中不会详细解释该访问方案的具体细节,通过观察发现在这个访问方案中对 MQT mqttab2 执行了 INSERT 操作(操作符 6)和 DELETE 操作(操作符 9),其中 INSERT 操作的输入是 FETCH(操作符 7)也就是从基表 basetab2 中获取数据并插入到 mqttab2 中,DELETE 操作的输入是 TBSCAN( 操作符 10) 也就是从 MQT mqttab2 中找到相应的数据进行删除。这个过程就是根据基表的最新数据向 MQT 中插入新数据或者删除无效的数据,这也是为什么只有 INSERT 操作和 DELETE 操作而没有 UPDATE 操作。
至此,我们已经通过访问方案理解了 MQT 的延迟刷新方式,接下来我们继续讨论当有登台(staging)表时的 MQT 延迟刷新方式。
有登台表的 REFRESH DEFERRED 方式
创建一个基表并插入若干数据,然后创建一个延迟刷新的 MQT,并创建一个登台表,基表和 MQT 的表结构与上文相同,差别在于这里创建了登台表 mqttab3_stg,也由此需要多执行一条 SET INTEGRITY 命令,使用的语句如清单 10 所示。
清单 10. 创建延迟刷新的 MQT 并创建登台表
create table basetab3
(c1 int not null primary key, c2 int, c3 int, c4 int);
insert into basetab3
values(1,1,1,1),(2,2,2,2),(3,3,3,3),(11,11,11,11);
create table mqttab3 as
(select c1, c2, c3 from basetab3 where c1 > 10)"
data initially deferred refresh deferred;
create table mqttab3_stg for mqttab3 propagate immediate;
set integrity for mqttab3 materialized query immediate unchecked;
set integrity for mqttab3_stg staging immediate unchecked;
db2 describe table hqy.MQTTAB3_STG
Data ty