欢迎来到Java学习网!
设为首页 | 加入收藏
当前位置: 首页 > 数据库 > 数据库综合 >

  使用MQT物化查询表(MaterializedQueryTables,MQT)

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

  MQT是基于查询的结果定义的一个表。MQT中包含的数据来自MQT定义所基于的一个或多个表。总结表(也称自动总结表[AST])对于IBMDB2forLinux,Unix,andWindows的用户来说应该感到比较熟悉,它们可以看作是特殊的MQT。fullselect是总结表定义的一部分,它包含一个GROUPBY子句,该子句总结fullselect中所引用表中的数据。

  您可以将MQT看作一种物化的视图。视图和MQT都是基于一个查询来定义的。每当视图被引用时,视图所基于的查询便会运行。但是,MQT实际上会将查询结果存储为数据,您可以使用MQT中的这些数据,而不是使用底层表中的数据。MQT可以显著提高查询的性能,尤其是提高复杂查询的性能。如果优化器确定查询或查询的一部分可以用一个MQT来解决,那么查询就可以被重写以便利用MQT。MQT可以在创建表时定义,可以定义为由系统维护,也可以定义为由用户维护。

  这种MQT中的数据是由系统维护的。当创建这种类型的MQT时,可以指定表数据是REFRESHIMMEDIATE还是REFRESHDEFERRED。通过REFRESH关键字可以指定如何维护数据。DEFERRED的意思是,表中的数据可以在任何时候通过REFRESHTABLE语句来刷新。系统维护的MQT,不管是REFRESHDEFERRED类型的还是REFRESHIMMEDIATE类型的,对它们的插入、更新或删除操作都是不允许的。但是,对于REFRESHIMMEDIATE类型的系统维护的MQT,可以通过对底层表的更改(即插入、更新或删除操作)来更新。

  下面的小节将展示一个创建REFRESHIMMEDIATE类型的系统维护的MQT的例子。这个表名为EMP,它基于SAMPLE数据库中的底层表EMPLOYEE和DEPARTMENT。由于REFRESHIMMEDIATEMQT要求来自查询内引用的每个表至少有一个惟一键要出现在select列表中,所以我们首先在EMPLOYEE表的EMPNO列上定义一个惟一性约束,另外还要在DEPARTMENT表的DEPTNO列上定义一个惟一性约束。DATAINITIALLYDEFERRED子句的意思是,在执行CREATETABLE语句的时候,并不将数据插入到表中。MQT被创建好之后,就会处于检查暂挂(checkpending)状态,在对它执行SETINTEGRITY语句之前,不能查询它。IMMEDIATECHECKED子句指定,必须根据用于定义该MQT的查询对数据进行检查,并刷新数据。NOTINCREMENTAL子句指定对整个表进行完整性检查。

  CONNECTTOSAMPLE

  ...

  ALTERTABLEEMPLOYEEADDUNIQUE(EMPNO)

  ALTERTABLEDEPARTMENTADDUNIQUE(DEPTNO)

  

  CREATETABLEEMPAS(SELECTE.EMPNO,E.FIRSTNME,E.LASTNAME,E.PHONENO,D.DEPTNO,

  SUBSTR(D.DEPTNAME,1,12)ASDEPARTMENT,D.MGRNOFROMEMPLOYEEE,DEPARTMENTD

  WHEREE.WORKDEPT=D.DEPTNO)

  DATAINITIALLYDEFERREDREFRESHIMMEDIATE

  

  SETINTEGRITYFOREMPIMMEDIATECHECKEDNOTINCREMENTAL

  


    相关教程
    推荐内容