天地不仁,以万物为刍狗!

物化查询表简介

上一篇 / 下一篇  2008-04-09 09:07:58 / 个人分类:db2

物化查询表简介

最近研究了一下db2的物化查询表,分享一下部分知识!

物化查询表(MQT)的定义是以一次查询的结果为基础的。MQT 可以显著提高查询的性能。本文将介绍 MQT、总结表(summary)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

物化查询表(MQT)是一种以一次查询的结果为基础定义的表。包含在物化查询表中的数据来自定义物化查询表时所基于的一个或多个表。而 总结表(也称自动总结表,AST)对于 IBM® DB2® Universal Database?(UDB)for Linux、 UNIX® 和 Windows®(DB2 UDB)的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上则是将查询结果保存为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。

物化查询表可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么就会重写查询,以便利用 MQT。
j7Ntl(fG}0goC0MQT 可以在创建表时定义,或者定义为系统维护的 MQT,或者定义为用户维护的 MQT。下面的几个小节将介绍这两种类型的 MQT,另外再介绍总结表和 staging 表。后面的例子要求连接到 SAMPLE 数据库。如果您系统上还没有创建 SAMPLE 数据库,那么可以通过在命令行提示符下输入 db2sampl 命令来创建这个数据库。

系统维护的 MQT
f9Zx YJp3u0这种物化查询表中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。不管是 REFRESH DEFERRED 还是 REFRESH IMMEDIATE 类型的系统维护的 MQT,对它们的 insert、update 或 delete 操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即 insert、update 或 delete 操作)来更新。

清单 1 展示了一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求查询的 select 列表中引用的每个表中至少有一个惟一键,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就处于检查暂挂在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句规定,根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句规定对整个表进行完整性检查。通过查询 EMP 物化查询表发现,它现在已经填入了数据。

清单 1. 创建由系统维护的 MQTITPUB个人空间^x$A |)_q%{a3Q)|
connect to sampleITPUB个人空间o"M$r#W+jCxN4^
...
Z@2}VUcT0alter table employee add unique (empno)ITPUB个人空间+J~p-o*r3V1?%P Hq
alter table department add unique (deptno)
+w].M$eX _roD0create table emp as (select e.empno, e.firstnme, e.lastname, e.phoneno, d.deptno,
c.h*S6\ c [%Yq0substr(d.deptname, 1, 12) as department, d.mgrno from employee e, department dITPUB个人空间ZN/WjK9L2h*F
  where e.workdept = d.deptno)ITPUB个人空间o(O0f,Q*ej l!S#Q k w K"_
   data initially deferred refresh immediateITPUB个人空间)Q1j)m D&K!Kg5@
set integrity for emp immediate checked not incrementalITPUB个人空间6l1@j/Q&oT,D
select * from empITPUB个人空间 JXtb0~$H s]
EMPNO  FIRSTNME     LASTNAME        PHONENO DEPTNO DEPARTMENT   MGRNO
3yJ&wA }L~zR0------ ------------ --------------- ------- ------ ------------ ------ITPUB个人空间 @3x[;d pXM#]9NXAj'N
000010 CHRISTINE    HAAS            3978    A00    SPIFFY COMPU 000010
jh&m0N[0000020 MICHAEL      THOMPSON        3476    B01    PLANNING     000020ITPUB个人空间`6z:B Jr Z9Zy!y
000030 SALLY        KWAN            4738    C01    INFORMATION  000030
.O;Q `BEf6s0000050 JOHN         GEYER           6789    E01    SUPPORT SERV 000050
t8]e9H%M+\:M3D0000060 IRVING       STERN           6423    D11    MANUFACTURIN 000060
f&g$b ]'`qz1@!J'b n^0000070 EVA          PULASKI         7831    D21    ADMINISTRATI 000070
7ov|-`8s _6f3G8i0000090 EILEEN       HENDERSON       5498    E11    OPERATIONS   000090ITPUB个人空间7X-s;H[,U&dn{
000100 THEODORE     SPENSER         0972    E21    SOFTWARE SUP 000100
+p5~%g{u-cfB0000110 VINCENZO     LUCCHESSI       3490    A00    SPIFFY COMPU 000010
e!a4t6Yw.@ u#c:F{0000120 SEAN         O'CONNELL       2167    A00    SPIFFY COMPU 000010ITPUB个人空间5s;\Zr/}A o
000130 DOLORES      QUINTANA        4578    C01    INFORMATION  000030ITPUB个人空间"E*i9M}7{u_
...
X}1do@\ r&S0000340 JASON        GOUNOT          5698    E21    SOFTWARE SUP 000100
}8a'i T%F nJ\H.C0P0  32 record(s) selected.
5o6{~|-rs\0connect reset

用户维护的 MQT
iNe"F2} H/]4e0这种物化查询表中的数据是由用户维护的。只有 REFRESH DEFERRED 物化查询表可以定义为 MAINTAINED BY USER。不能对用户维护的 MQT 发出 REFRESH TABLE 语句(用于系统维护的 MQT)。但是,用户维护的 MQT 却 允许对它们执行 insert、update 或 delete 操作。

清单 2 展示了一个创建 REFRESH DEFERRED 类型的用户维护的 MQT 的例子。这个表名为 ONTARIO_1995_SALES_TEAM,它基于数据库 SAMPLE 中的底层表 EMPLOYEE 和 SALES。同样,DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建之后,便处于检查暂挂状态在对它执行 SET INTEGRITY 语句之前,不能查询它。MATERIALIZED QUERY IMMEDIATE UNCHECKED 子句规定,该表将启用完整性检查,但是不必检查它是否违反了完整性约束,便可以使之脱离检查暂挂状态。

接下来,为了填充数据到 MQT 中,我们将导入从 EMPLOYEE 和 SALES 表中导出的数据。用于导出数据的查询与用于定义 MQT 的查询是一致的。然后,我们将插入另外一条记录到 ONTARIO_1995_SALES_TEAM 表中。

通过查询 ONTARIO_1995_SALES_TEAM 物化查询表发现,它现在已经填入了刚才导入的和插入的数据,这表明用户维护的 MQT 的确可以直接被修改。

清单 2. 创建由用户维护的 MQT
.w)G%a.V&l3C)G0connect to sampleITPUB个人空间6B'n7}h4~l)X
...ITPUB个人空间8G2[)E1Go0S/Ppd.D+V)C
create table ontario_1995_sales_team as (select distinct e.empno, e.firstnme,ITPUB个人空间X2?2[0Hmk
e.lastname, e.workdept, e.phoneno, 'Ontario' as region,ITPUB个人空间6e? h|3otE
  year(s.sales_date) as year from employee e, sales s
#CKYgV3S2^ Sl0   where e.lastname = s.sales_person and year(s.sales_date) = 1995
:hXR5Q!K*o;?t+XY%Y&K0    and left(s.region, 3) = 'Ont')ITPUB个人空间*l*{ E;d(H$m7g RK?
     data initially deferred refresh deferred maintained by user
HQ? h}-KQL0set integrity for ontario_1995_sales_team materialized query immediateITPUB个人空间6V I0ievK
uncheckedITPUB个人空间B y&r7|5VI\*t QK2c5C
export to ontario_1995_sales_team.del of del
!C9\7A4fr0select distinct e.empno, e.firstnme, e.lastname, e.workdept, e.phoneno,ITPUB个人空间%v7j K;L8^%\9k
  'Ontario' as region, year(s.sales_date) as year from employee e,
V EAW!gc#R0  sales s
rgpp \M s)?|$B0   where e.lastname = s.sales_person and year(s.sales_date) = 1995ITPUB个人空间 _1ql;R#U*I0]Y)v'e
    and left(s.region, 3) = 'Ont'ITPUB个人空间 I.dZE}
...
^4V\c2F8H6Yr0Number of rows exported: 2
Dn-qC5Jj)R,J*No0import from ontario_1995_sales_team.del of del insert intoITPUB个人空间FLs/Z%Fr1y \
ontario_1995_sales_teamITPUB个人空间\ ].fld ~6C
...ITPUB个人空间*_~l"f@nwg#d
Number of rows committed    = 2ITPUB个人空间+xg:i8V;~C+T1^|
insert into ontario_1995_sales_team
,s#?R\r+E+{4j0values ('006900', 'RUSS', 'DYERS', 'D44', '1234', 'Ontario', 1995)
0nH[/J ^$bD#o)B0select * from ontario_1995_sales_teamITPUB个人空间!pc r m3z#@+dUP
EMPNO  FIRSTNME     LASTNAME        WORKDEPT PHONENO REGION  YEAR
#NPY;J"P$^X0------ ------------ --------------- -------- ------- ------- -----------ITPUB个人空间(T@k;m:d?'r^
000110 VINCENZO     LUCCHESSI       A00      3490    Ontario        1995ITPUB个人空间 kvC];LU`u
000330 WING         LEE             E21      2103    Ontario        1995ITPUB个人空间&pZ9|%XN w7}
006900 RUSS         DYERS           D44      1234    Ontario        1995ITPUB个人空间@0Dp&L4Y M2q b
  3 record(s) selected.
%HK!LxWT a0connect reset

物化查询表(MQT)的定义是以一次查询的结果为基础的。MQT 可以显著提高查询的性能。本文将介绍 MQT、总结表(summary)和 staging 表,并通过一些实用的例子展示如何创建和使用物化查询表。

物化查询表(MQT)是一种以一次查询的结果为基础定义的表。包含在物化查询表中的数据来自定义物化查询表时所基于的一个或多个表。而 总结表(也称自动总结表,AST)对于 IBM® DB2® Universal Database?(UDB)for Linux、 UNIX® 和 Windows®(DB2 UDB)的用户来说应该感到比较熟悉,它们可以看作是特殊的 MQT。fullselect 是总结表定义的一部分,它包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。

您可以将 MQT 看作一种物化的视图。视图和 MQT 都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT 实际上则是将查询结果保存为数据,您可以使用 MQT 中的这些数据,而不是使用底层表中的数据。

物化查询表可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个 MQT 来解决,那么就会重写查询,以便利用 MQT。ITPUB个人空间qY3QZ)UU)I;L-b
MQT 可以在创建表时定义,或者定义为系统维护的 MQT,或者定义为用户维护的 MQT。下面的几个小节将介绍这两种类型的 MQT,另外再介绍总结表和 staging 表。后面的例子要求连接到 SAMPLE 数据库。如果您系统上还没有创建 SAMPLE 数据库,那么可以通过在命令行提示符下输入 db2sampl 命令来创建这个数据库。

系统维护的 MQT
:wh2E%MmB!]&npq@0这种物化查询表中的数据是由系统维护的。当创建这种类型的 MQT 时,可以指定表数据是 REFRESH IMMEDIATE 还是 REFRESH DEFERRED。通过 REFRESH 关键字可以指定如何维护数据。DEFERRED 的意思是,表中的数据可以在任何时候通过 REFRESH TABLE 语句来刷新。不管是 REFRESH DEFERRED 还是 REFRESH IMMEDIATE 类型的系统维护的 MQT,对它们的 insert、update 或 delete 操作都是不允许的。但是,对于 REFRESH IMMEDIATE 类型的系统维护的 MQT,可以通过 对底层表的更改(即 insert、update 或 delete 操作)来更新。

清单 1 展示了一个创建 REFRESH IMMEDIATE 类型的系统维护的 MQT 的例子。这个表名为 EMP,它基于 SAMPLE 数据库中的底层表 EMPLOYEE 和 DEPARTMENT。由于 REFRESH IMMEDIATE MQT 要求查询的 select 列表中引用的每个表中至少有一个惟一键,所以我们首先在 EMPLOYEE 表的 EMPNO 列上定义一个惟一性约束,另外还在 DEPARTMENT 表的 DEPTNO 列上定义一个惟一性约束。DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建好之后,就处于检查暂挂(check pending)状态(请参阅 DB2 基础: 阐明表和表空间的状态),在对它执行 SET INTEGRITY 语句之前,不能查询它。IMMEDIATE CHECKED 子句规定,根据用于定义该 MQT 的查询对数据进行检查,并刷新数据。NOT INCREMENTAL 子句规定对整个表进行完整性检查。通过查询 EMP 物化查询表发现,它现在已经填入了数据。

清单 1. 创建由系统维护的 MQT
"z%C#` a9[&X9Q/i \0connect to sampleITPUB个人空间1}eEn(m4lvL
...ITPUB个人空间'pKKh'm
alter table employee add unique (empno)ITPUB个人空间SE:AK{y)J Q
alter table department add unique (deptno)
5SLjPU&Y"@B0create table emp as (select e.empno, e.firstnme, e.lastname, e.phoneno, d.deptno,ITPUB个人空间UH E TDbp
substr(d.deptname, 1, 12) as department, d.mgrno from employee e, department dITPUB个人空间.^ CK$lN9k^I
  where e.workdept = d.deptno)
%d3n9P:nN"_G0   data initially deferred refresh immediateITPUB个人空间:SzHhu6|;Qe p-N
set integrity for emp immediate checked not incremental
'y+Of/V1f%i(ed0select * from empITPUB个人空间9Hf#PlAY?uw
EMPNO  FIRSTNME     LASTNAME        PHONENO DEPTNO DEPARTMENT   MGRNOITPUB个人空间k eClr
------ ------------ --------------- ------- ------ ------------ ------ITPUB个人空间9ww+x[dJi2Z$G/p
000010 CHRISTINE    HAAS            3978    A00    SPIFFY COMPU 000010ITPUB个人空间q7y'y'[!H,U"t6f`
000020 MICHAEL      THOMPSON        3476    B01    PLANNING     000020ITPUB个人空间4Z0z$h"_f/}2@eI?
000030 SALLY        KWAN            4738    C01    INFORMATION  000030
!^W P-t d9sPt;P`I0000050 JOHN         GEYER           6789    E01    SUPPORT SERV 000050
8j7L#BA g0000060 IRVING       STERN           6423    D11    MANUFACTURIN 000060ITPUB个人空间$]6t'q6yr Tk
000070 EVA          PULASKI         7831    D21    ADMINISTRATI 000070ITPUB个人空间 L%W/B't)LT{
000090 EILEEN       HENDERSON       5498    E11    OPERATIONS   000090
X P6B'KE,U;u0000100 THEODORE     SPENSER         0972    E21    SOFTWARE SUP 000100ITPUB个人空间 eBN:{.ly
000110 VINCENZO     LUCCHESSI       3490    A00    SPIFFY COMPU 000010ITPUB个人空间)i snn;Z
000120 SEAN         O'CONNELL       2167    A00    SPIFFY COMPU 000010ITPUB个人空间z&V4s8K B6H{ L0q
000130 DOLORES      QUINTANA        4578    C01    INFORMATION  000030
Z/zm#B!u+w+^ P2@L0...ITPUB个人空间Jj3qwy!S
000340 JASON        GOUNOT          5698    E21    SOFTWARE SUP 000100
3B6e w{O'~ ~0  32 record(s) selected.
-@(q(~Cz _CV[0connect reset

用户维护的 MQTITPUB个人空间f;h!~7X&sYN x2k
这种物化查询表中的数据是由用户维护的。只有 REFRESH DEFERRED 物化查询表可以定义为 MAINTAINED BY USER。不能对用户维护的 MQT 发出 REFRESH TABLE 语句(用于系统维护的 MQT)。但是,用户维护的 MQT 却 允许对它们执行 insert、update 或 delete 操作。

清单 2 展示了一个创建 REFRESH DEFERRED 类型的用户维护的 MQT 的例子。这个表名为 ONTARIO_1995_SALES_TEAM,它基于数据库 SAMPLE 中的底层表 EMPLOYEE 和 SALES。同样,DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。MQT 被创建之后,便处于检查暂挂状态(请参阅 DB2 基础: 阐明表和表空间的状态),在对它执行 SET INTEGRITY 语句之前,不能查询它。MATERIALIZED QUERY IMMEDIATE UNCHECKED 子句规定,该表将启用完整性检查,但是不必检查它是否违反了完整性约束,便可以使之脱离检查暂挂状态。

接下来,为了填充数据到 MQT 中,我们将导入从 EMPLOYEE 和 SALES 表中导出的数据。用于导出数据的查询与用于定义 MQT 的查询是一致的。然后,我们将插入另外一条记录到 ONTARIO_1995_SALES_TEAM 表中。

通过查询 ONTARIO_1995_SALES_TEAM 物化查询表发现,它现在已经填入了刚才导入的和插入的数据,这表明用户维护的 MQT 的确可以直接被修改。

清单 2. 创建由用户维护的 MQT
ig$x[l7M9B0connect to sampleITPUB个人空间 iOz'^I@E
...
0|8y%NQw"u$Q d0create table ontario_1995_sales_team as (select distinct e.empno, e.firstnme,ITPUB个人空间*G)z,X1dQ5X LRji
e.lastname, e.workdept, e.phoneno, 'Ontario' as region,ITPUB个人空间&P!i+KcXi`;P3J
  year(s.sales_date) as year from employee e, sales sITPUB个人空间+HLz%j YU+I
   where e.lastname = s.sales_person and year(s.sales_date) = 1995ITPUB个人空间;HL,ds1IM*e iI\
    and left(s.region, 3) = 'Ont')
$qR*BA(C h#s.bSz}0     data initially deferred refresh deferred maintained by user
wN/UP*e1J*g$cC0set integrity for ontario_1995_sales_team materialized query immediateITPUB个人空间2s$~*C-\2S*a?
unchecked
wH8L&\"[p|0export to ontario_1995_sales_team.del of delITPUB个人空间2S I1hF2v0k iW
select distinct e.empno, e.firstnme, e.lastname, e.workdept, e.phoneno,
za/R%m/o L0  'Ontario' as region, year(s.sales_date) as year from employee e,
'tu5} P]Y!n5Y6L!M_0  sales s
wK.xWM9_;D {2M0   where e.lastname = s.sales_person and year(s.sales_date) = 1995
|(W4?6Zrqh)p H0    and left(s.region, 3) = 'Ont'ITPUB个人空间K Ht~&q Q9};]t
...ITPUB个人空间@-{{$bQf9m
Number of rows exported: 2
'vE#qU\~m0import from ontario_1995_sales_team.del of del insert intoITPUB个人空间2vor9L9{Z
ontario_1995_sales_teamITPUB个人空间-eA m+J4PF]-x,p
...ITPUB个人空间(IR gd2Gw%]'^a
Number of rows committed    = 2ITPUB个人空间J#|1q#\XP
insert into ontario_1995_sales_team
9a*O*Z-U M'm)i-x0values ('006900', 'RUSS', 'DYERS', 'D44', '1234', 'Ontario', 1995)
eS C S4Ou rQT!gX0select * from ontario_1995_sales_team
x.E5n?1Hu0EMPNO  FIRSTNME     LASTNAME        WORKDEPT PHONENO REGION  YEAR
RG(C"}5{E$VUO0------ ------------ --------------- -------- ------- ------- -----------
$tX;?1XD&RX2io8K0000110 VINCENZO     LUCCHESSI       A00      3490    Ontario        1995ITPUB个人空间*q3MrUcJ
000330 WING         LEE             E21      2103    Ontario        1995ITPUB个人空间5L6P"l%WDy%zFZ9K
006900 RUSS         DYERS           D44      1234    Ontario        1995
0T9A3wZ1t+T0  3 record(s) selected.ITPUB个人空间.j@+ymXc8{~B
connect reset

总结表
i"k s/qdI0您应该记得,总结表是一种特殊类型的 MQT,它们的 fullselect 包含一个 GROUP BY 子句,该子句总结 fullselect 中所引用表中的数据。清单 3 展示了一个简单的创建总结表的例子。该表名为 SALES_SUMMARY,它基于 SAMPLE 数据库中的底层表 SALES。同样,DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。REFRESH DEFERRED 子句的意思是,在任何时候都可以用 REFRESH TABLE 语句刷新该表中的数据。当这个 MQT 刚创建且还没有发出 REFRESH TABLE 语句的时候,对它的查询将返回一个错误。而执行了 REFRESH TABLE 语句之后,对它的查询可以成功运行。

在对 SALES 表执行插入操作,再刷新总结表之后,对总结表的查询表明,对底层表的更改已经反映到总结表中:销售员 Lee 在 Ontario-South 地区的总销售量增加了 100。类似地,在对底层表执行 update 或 delete 操作之后,也可以在总结表中观察到相应的变化。

清单 3. 创建总结表
f Ga3W2P2a'ya0connect to sample
4X)w7tj7`T,|0...
Z:|UEN%F;`*i:u0create table sales_summary as (select sales_person, region, sum(sales)ITPUB个人空间h%bRU S ln/\
as total_sales
kQ0R^ w~T2jI0from sales group by sales_person, region)ITPUB个人空间~ \"a*N vQ$V
  data initially deferred refresh deferred
Z2?&p%yG v|8Z0select * from sales_summary
&yM;F]jd+u^0SALES_PERSON    REGION          TOTAL_SALESITPUB个人空间? W/a S ^[8G-~K
--------------- --------------- -----------ITPUB个人空间e1f6?9xc&F
SQL0668N  Operation not allowed for reason code "1" on tableITPUB个人空间4BfT:Du$C9~;_/F;m"Bt
"MELNYK.SALES_SUMMARY".  SQLSTATE=57016
#QXXV`4gI0[0refresh table sales_summaryITPUB个人空间%Y2N5D%E6i4D[:v:v6C
select * from sales_summary
_gV I Mm L0SALES_PERSON    REGION          TOTAL_SALES
c*~O?Ro2[+]LK-y0--------------- --------------- -----------
Vy3pb/_7|8DIP:E0GOUNOT          Manitoba                 15
^| fih j*TmMu ~0GOUNOT          Ontario-North             1
,y+d/Y9rA*] fV0GOUNOT          Ontario-South            10
LV:_#l~nQ3z(R0GOUNOT          Quebec                   24ITPUB个人空间 W2|J7z^6f
LEE             Manitoba                 23
kW0Vg3O2Z @/h;aV0LEE             Ontario-North             8ITPUB个人空间E:I!e-K{)w
LEE             Ontario-South            34ITPUB个人空间*F~2b-i9`;im M a
LEE             Quebec                   26
$zBAH:j.ce0LUCCHESSI       Manitoba                  3ITPUB个人空间XYQOzL v\
LUCCHESSI       Ontario-South             8
?tH%j[0LUCCHESSI       Quebec                    3
&p1Kf_r|;J0  11 record(s) selected.ITPUB个人空间#f|qiy @
insert into sales values ('06/28/2005', 'LEE', 'Ontario-South', 100)ITPUB个人空间'l;x0aky0`-Y!d
refresh table sales_summaryITPUB个人空间)Hv%l%Y&Lp
select * from sales_summaryITPUB个人空间&y_e?)U;z
SALES_PERSON    REGION          TOTAL_SALES
kT5qCJ { [#tt0--------------- --------------- -----------
1s@$T)T QQ0...ITPUB个人空间V'Lt@#@0v H@6e
LEE             Ontario-North             8
4c)e`6sM9dI0LEE             Ontario-South           134
#|.q F3sp/SY1JOK0LEE             Quebec                   26
;t9PQg0\ d,Y[7M-`0...
;oK+D-P.iU|0  11 record(s) selected.ITPUB个人空间)|j9m)K,U dFb
update sales set sales = 50 where sales_date = '06/28/2005' and
Ht7Pt[{0sales_person = 'LEE'ITPUB个人空间}$a7k6F7JI$w
and region = 'Ontario-South'ITPUB个人空间(al%A_+j5\ C7t
refresh table sales_summaryITPUB个人空间7LO,MH Y;F)i x
select * from sales_summaryITPUB个人空间6df:@9{/A0aVh
SALES_PERSON    REGION          TOTAL_SALES
-C }%k9l7|Y&pa0--------------- --------------- -----------
.Y_.x"uH4m#u,|0...ITPUB个人空间LEJ$Vg!u2r[@L
LEE             Ontario-North             8ITPUB个人空间})U4g\P
LEE             Ontario-South            84
%[9A+c;B4}Dr3N*A(_7\0LEE             Quebec                   26
m}-~)f(FJc0...
?k&QNd2o@?0  11 record(s) selected.ITPUB个人空间Z2X+Qf u)^k T u
delete from sales where sales_date = '06/28/2005' and sales_person = 'LEE'
9l jq;{EB;n0and region = 'Ontario-South'ITPUB个人空间@:V/A(r b8IV [7S
refresh table sales_summaryITPUB个人空间f+O:vN)Tjo5?
select * from sales_summaryITPUB个人空间E Ah,p/lX"J2foL'i
SALES_PERSON    REGION          TOTAL_SALESITPUB个人空间;Jc%u3G,N9g b/x
--------------- --------------- -----------ITPUB个人空间,ZX+L.k }8ThMIa~
...
_P.TO*X0LEE             Ontario-North             8
n(@G5fmFn0LEE             Ontario-South            34ITPUB个人空间Ce$r&i d x:AC
LEE             Quebec                   26ITPUB个人空间6oCV%z.YP]W&K
...ITPUB个人空间O!StS"Y l DG
  11 record(s) selected.
rZ:a_KGnaf;S0connect reset

staging 表
P[6T0pC(b0如果 REFRESH DEFERRED MQT 有一个相关联的 staging 表,那么可以对其执行增量刷新。staging 表 收集更改,以便应用这些更改,使得 MQT 与它的底层表同步。可以使用 CREATE TABLE 语句创建一个 staging 表。然后,当 MQT 的底层表被修改时,变化就会传播过来,并立即被添加到 staging 表中。其思想是,使用 staging 表增量式地刷新 MQT,而不是从头开始重新生成 MQT。增量式维护这种方式可以显著提高性能。当刷新操作完成时,staging 表就会被删除。

staging 表被创建之后,便处于悬挂(不一致)状态。在开始收集底层表上的更改之前,它必须脱离这种状态。为此,可以使用 SET INTEGRITY 语句。

清单 4 展示了一个使用有关联总结表的 staging 表的例子。总结表名为 EMP_SUMMARY,它基于 SAMPLE 数据库中的底层表 EMPLOYEE。您应该还记得,DATA INITIALLY DEFERRED 子句的意思是,在执行 CREATE TABLE 语句的时候,并不将数据插入到表中。而 REFRESH DEFERRED 子句的意思是,在任何时候都可以使用 REFRESH TABLE 语句刷新该表中的数据。staging 表名为 EMP_SUMMARY_S,它与总结表 EMP_SUMMARY 相关联。PROPAGATE IMMEDIATE 子句规定,在 insert、update 或 delete 操作中对底层表做出的任何更改,都将被累积在 staging 表中。对于这两个表,都发出 SET INTEGRITY 语句,以便使它们都脱离悬挂状态。

不出所料,此时对总结表的查询没有返回任何数据。REFRESH TABLE 语句返回一条警告,提示说 "integrity of non-incremental data remains unverified"。这也不值得惊讶。再次查询总结表,仍然没有返回任何数据。但是,当我们插入新的一行数据到底层的 EMPLOYEE 表之后,再次查询 staging 表 EMP_SUMMARY_S 便返回一行记录,这行数据与刚才插入的数据是一致的。staging 表中有三个列与其底层总结表中的三列相同,另外还有两个由系统使用的列:GLOBALTRANSID(每个被传播的行对应的全局事务 ID)和 GLOBALTRANSTIME(事务的时间戳)。再次查询总结表,又是没有返回数据,但是当执行了 REFRESH TABLE 语句之后,查询得以成功运行。

清单 4. 使用有关联总结表的 staging 表
(`Xd\M0~P2K0connect to sampleITPUB个人空间"Ol&G z P
...
9BBTdN0create table emp_summary as (select workdept, job, count(*) as count
,C emdW5?7x8b,CIqi0from employee group by workdept, job)
?&wqqq}W;Y#\0  data initially deferred refresh deferred
I(N7G|3}z$]3b0create table emp_summary_s for emp_summary propagate immediate
lsuc L%Pa8_0set integrity for emp_summary materialized query immediate unchecked
6GQ+p6B4Mzh:rnf0set integrity for emp_summary_s staging immediate uncheckedITPUB个人空间e-R0U$i Cr P;k
select * from emp_summaryITPUB个人空间I'?0Q7m+e5]r
WORKDEPT JOB      COUNTITPUB个人空间7l7c:M:d:Rk
-------- -------- -----------ITPUB个人空间.U3bo9gbqx
  0 record(s) selected.ITPUB个人空间;n$aNu ~8n)U
refresh table emp_summary
q_)_*E7c;E0SQL1594W  Integrity of non-incremental data remains unverified by theITPUB个人空间)W'?j2]P#d.F.v?l0r
database manager.  SQLSTATE=01636
y"A}_BgP;_Z0select * from emp_summary
Qb1[ iW.nA-r0WORKDEPT JOB      COUNT
bB g1My%RI0-------- -------- -----------
$A"L+[B]4C\k0  0 record(s) selected.ITPUB个人空间a4tlVef.VD{
insert into employee
/M D.\TAl I/cJ0values ('006900', 'RUSS', 'L', 'DYERS', 'D44', '1234', '1960-05-05',
0AT)`pX)joJJ0'FIELDREP', 5, 'M', '1940-04-02', 10000, 100, 1000)
{2a&E+T U7\/h0select * from emp_summary_sITPUB个人空间q4|%] a yTD0^2r
WORKDEPT JOB      COUNT       GLOBALTRANSID          GLOBALTRANSTIMEITPUB个人空间Xp6aN8X(z v
-------- -------- ----------- -------------------... -----------------------------...ITPUB个人空间Jl \ nP%j
D44      FIELDREP           1 x'00000000000000CD'    x'20050822201344536158000000'ITPUB个人空间7B YE+z,JJhx
  1 record(s) selected.ITPUB个人空间8i#^W,K%pY`2H
select * from emp_summary
-Gswd1wW~0WORKDEPT JOB      COUNTITPUB个人空间 }"LN5^9LPYy6?
-------- -------- -----------
Dx-ao d|P u0  0 record(s) selected.ITPUB个人空间OC)V ] `!L W.tw2l5Q
refresh table emp_summary
pGB5R5lo%v3J0SQL1594W  Integrity of non-incremental data remains unverified by the databaseITPUB个人空间z/| ^E;~ X,SC
manager.  SQLSTATE=01636ITPUB个人空间4PpQYh.A ^YT.L
select * from emp_summary
f^'hyjuW.gJk0WORKDEPT JOB      COUNTITPUB个人空间M6A"s,VE0F8u
-------- -------- -----------
"[@agCsy;R0D44      FIELDREP           1ITPUB个人空间K3S+e*a.]i'd,@
  1 record(s) selected.
[-F"d-Le$H.|d2{.P(VC0connect reset

结束语
z3e9Z9I*Mx0在 SYSCAT.TABDEP 系统编目视图中,对于一个物化查询表在其他对象上的每个依赖关系,都有相应的一行。您可以查询这个视图,获得对我们创建的 MQT(清单 5)的依赖关系的总结。MQT 有一个值为 'S' 的 DTYPE。TABNAME 列列出 MQT 的名称,BNAME 列列出相应的 MQT 所依赖的数据库对象的名称。BTYPE 列显示对象类型:'T' 表示表,'I' 表示索引,'F' 表示函数实例。

清单 5. 查询 SYSCAT.TABDEP 系统编目视图,以查看 MQT 在其他数据库对象上的依赖关系ITPUB个人空间s%TZtby
connect to sample
8n%q-P Hlp3T3Mz0...
y9m[s!x~LL U5?6t'p0select substr(tabname,1,24) as tabname, dtype, substr(bname,1,24) as bname, btype
a8Y)cQ![9C)w0from syscat.tabdep where tabschema = 'MELNYK' and dtype = 'S'
"VW*j N!`0TABNAME                  DTYPE BNAME                    BTYPE
?4Gw2^Yonn0------------------------ ----- ------------------------ -----ITPUB个人空间#x4o5A$CX(E;x7~b
EMP                      S     DEPARTMENT               TITPUB个人空间5E/B}6Ad$Dt
EMP                      S     EMPLOYEE                 TITPUB个人空间k/V T,h;B%`#W,}9B0q
EMP                      S     SQL050829104058970       I
:ya R1OiEPp:H4q0EMP                      S     SQL050829104058800       IITPUB个人空间zl(TN:L hvra
EMP_SUMMARY              S     EMPLOYEE                 TITPUB个人空间mB0QK9r1A `p:_?v
ONTARIO_1995_SALES_TEAM  S     LEFT1                    FITPUB个人空间-L-Po,}?pOM;Sv c
ONTARIO_1995_SALES_TEAM  S     SALES                    T
.w7Z.M$z)P0ONTARIO_1995_SALES_TEAM  S     EMPLOYEE                 T
1X ^U%K"u%IJ.\9u0SALES_SUMMARY            S     SALES                    T
7b;o5O)wR]fJQ r0  9 record(s) selected.
+T!T$A6_Mc O$vT0connect reset


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-11-24  
      1
2345678
9101112131415
16171819202122
23242526272829
30      

数据统计

  • 访问量: 12228
  • 日志数: 273
  • 图片数: 1
  • 文件数: 2
  • 建立时间: 2007-12-01
  • 更新时间: 2008-11-19

RSS订阅

Open Toolbar