Prayer

在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

DB2 物化查询表

Posted on 2010-05-16 00:36 Prayer 阅读(686) 评论(0)  编辑 收藏 引用 所属分类: DB2

----start

    DB2 物化查询表MQT(MATERIALIZED QUERY TABLES)存储了一个查询的结果,当我们查询相关表时,DB2会自动决定是使用原表还是使用物化查询表。当数据库中有海量数据时,使用物化查询表可以极大的提高查询速度。但是,有一利就有一弊,维护物化查询表也是相当耗时的。所以,物化查询表广泛应用在数据仓库和海量数量的报表查询中,这类查询的特点是:数据量大、经常需要分组统计、数据不会频繁变更。正因为这些特点,在这些场合中物化查询表可以充分发挥它的优势。

语法:  
CREATE TABLE <table-name> AS  
<select stmtement>  
DATA INITIALLY DEFERRED  
REFRESH [DEFERRED | IMMEDIATE]  
[ENABLE QUREY OPTIMIZATION | DISABLE QUREY OPTIMIZATION]  
[MAINTAINED BY [SYSTEM | USER | FEDERATED_TOOOL]]  
   
示例:  
CREATE TABLE emp_summary AS  
(  
         SELECT  
                  workdept  
                  ,COUNT(*) AS crows  
                  ,SUM(empno) AS sumno  
         FROM   
                  employee  
         GROUP BY workdept  
)  
DATA INITIALLY DEFERRED  
REFRESH IMMEDIATE; 
语法:
CREATE TABLE <table-name> AS
<select stmtement>
DATA INITIALLY DEFERRED
REFRESH [DEFERRED | IMMEDIATE]
[ENABLE QUREY OPTIMIZATION | DISABLE QUREY OPTIMIZATION]
[MAINTAINED BY [SYSTEM | USER | FEDERATED_TOOOL]]
 
示例:
CREATE TABLE emp_summary AS
(
         SELECT
                  workdept
                  ,COUNT(*) AS crows
                  ,SUM(empno) AS sumno
         FROM
                  employee
         GROUP BY workdept
)
DATA INITIALLY DEFERRED
REFRESH IMMEDIATE;

定义了物化查询表后,如果我们执行以下SQL,DB2优化器将使用MQT

select workdept,avg(empno) from employee group by workdept 
select workdept,avg(empno) from employee group by workdept

DB2 优化器将上面的SQL转化成下面这样

select workdept,sumno/crows from emp_summary 
select workdept,sumno/crows from emp_summary

    在定义物化查询表时,我们可以指定在原始表数据改变时,是立即刷新物化查询表(REFRESH IMMEDIATE)呢,还是延迟刷新(REFRESH DEFERRED );我们还可以指定,在适当的时候,允许优化器使用物化查询表(ENABLE QUREY OPTIMIZATION)呢,还是禁止使用(DISABLE QUREY OPTIMIZATION]);我们还可以指定,物化查询表是由系统维护(MAINTAINED BY SYSTEM)呢,还是由用户维护(MAINTAINED BY USER)。

    如果我们将物化查询表定义为延迟刷新(REFRESH DEFERRED ),那么在使用物化查询表之前,我们必须使用REFRESH TABLE 语句刷新它。如果定义为由用户负责维护物化查询表时,用户可以对物化查询表进行insert update delete 等操作,此时,物化查询表将不能REFRESH了。

    维护物化查询表是相当耗时的,为了提高维护效率,我们可以给延迟刷新(REFRESH DEFERRED)的物化查询表定义一个staging 表。staging 表用来对物化查询表执行增量刷新,当刷新完成时,staging 表就会被删除。对于上面定义的物化查询表,我们可以定义如下staging 表

CREATE TABLE emp_summary_st  
(  
        workdept,  
        crows,  
        sumno,  
        GLOBALTRANSID,  
        GLOBALTRANSTIME  
)FOR emp_summary PROPAGATE IMMEDIATE; 
CREATE TABLE emp_summary_st
(
        workdept,
        crows,
        sumno,
        GLOBALTRANSID,
        GLOBALTRANSTIME
)FOR emp_summary PROPAGATE IMMEDIATE;

    PROPAGATE IMMEDIATE 子句表示,原始表做出的任何更改,都将被累积在 staging 表中。GLOBALTRANSID表示每个被传播的行对应的全局事务 ID)。 GLOBALTRANSTIME表示事务的时间戳。taging 表创建后,处于检查暂挂状态,我们可以使用 SET INTEGRITY 语句将表设置为正常状态,这时候,我们就可以使用staging 表来刷新物化查询表了。

SET INTEGRITY FOR emp_summary_st STAGING IMMEDIATE UNCHECKED;  
REFRESH TABLE emp_summary; 
SET INTEGRITY FOR emp_summary_st STAGING IMMEDIATE UNCHECKED;
REFRESH TABLE emp_summary;

更多细节请参考DB2信息中心。

----更多参见:DB2 SQL 精萃

----声明:转载请注明出处。

----last updated 2010.1.21

----written by wave at 2010.1.21

----end

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/shangboerds/archive/2010/01/21/5220931.aspx


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理