DB2 物化查询表MQT

各数据库都有对应的物化视图来将查询的结果缓存于内存之中,显著地提高了查询的效率。而在DB2中,物化查询表MQT (Materialized Query Tables)就起到其他数据库中物化视图的作用。

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

虽然物化查询表极大地提高了查询的效率,但维护物化查询表也是相当耗时的。所以,物化查询表广泛应用在数据仓库和海量数量的报表查询中,这类查询的特点是:数据量大、经常需要分组统计、数据不会频繁变更。正因为这些特点,在这些场合中物化查询表可以充分发挥它的优势。

在定义物化查询表时,我们可以指定在原始表数据改变时,是立即刷新物化查询表(REFRESH IMMEDIATE),还是延迟刷新(REFRESH DEFERRED );还可以指定,物化查询表是由系统维护(MAINTAINED BY SYSTEM),还是由用户维护(MAINTAINED BY USER)。

1、立即刷新的MQT

CREATE TABLE COMMON.T_BAS_NODE_ACCE_USER_MQT (USER_ID,USER_NAME) 
AS ( select  USER_ID,USER_NAME from COMMON.T_BAS_NODE_ACCE_USER ) 
DATA INITIALLY DEFERRED REFRESH IMMEDIATE MAINTAINED BY SYSTEM;

SET INTEGRITY FOR COMMON.T_BAS_NODE_ACCE_USER_MQT IMMEDIATE CHECKED FULL ACCESS;

当基表COMMON.T_BAS_NODE_ACCE_USER 数据发生变化时,物化视图表的数据同时进行改变。

2、延迟刷新的MQT

 CREATE TABLE COMMON.T_BAS_NODE_ACCE_USER_MQT (USER_ID,USER_NAME) 
AS ( select ACCEUSER.USER_ID, ACCEUSER.USER_NAME from COMMON.T_BAS_NODE_ACCE_USER 
ACCEUSER INNER JOIN COMMON.T_BAS_FLOW_INS FIN ON ACCEUSER.T_BAS_FLOW_INS_ID = FIN.T_BAS_FLOW_INS_ID ) 
DATA INITIALLY DEFERRED REFRESH DEFERRED maintained by user  ;

SET INTEGRITY FOR COMMON.T_BAS_NODE_ACCE_USER_MQT materialized query immediate unchecked;

当关联基表的数据发生变化时,物化视图表的数据无法立即同步,必须先刷新物化视图表,数据才能准确。

refresh table COMMON.T_BAS_NODE_ACCE_USER_MQT;

但在实际使用过程中,不可能每次都刷新MQT之后,在查询数据。通过创建触发器达到基表数据更新时,对MQT进行刷新。

CREATE TRIGGER COMMON.T_BAS_NODE_ACCE_USER_TRIGGER
AFTER INSERT 
ON COMMON.T_BAS_NODE_ACCE_USER
FOR EACH STATEMENT 
BEGIN 
   DECLARE param VARCHAR(1000);
  
   SET param = 'refresh table COMMON.T_BAS_NODE_ACCE_USER_MQT';
   PREPARE s1 FROM param;
   EXECUTE s1 ;

END;

 

你可能感兴趣的:(SQL)