• DB2中的MQT优化机制详解和实践


      MQT :物化查询表。是以一次查询的结果为基础  定义创建的表(实表),以量取胜(特别是在百万,千万级别的量,效果更显著),可以更快的查询到我们需要的结果。MQT有两种类型,一种是系统维护的MQT ,一种是用户维护的MQT。本处是基于系统维护的MQT展开解析。

      对于系统维护的MQT,这么和基表操作的数据更新。通过两种刷新机制:一种是即时刷新  refresh immediate ,另一种是延迟更新 refresh deferred 。

      所谓的即时更新,就是当基表进行CRUD(增删改查)的操作时,对应的MQT表数据也会进行相应的刷新,这样的优点是能够保证MQT中的数据中是最新的,但是由于对基表进行操作的同时还要维护MQT表,负载有所增加。

      使用延迟更新,当对基表进行操作的时候,MQT中的数据没有进行刷新,而是等到用户(DBA)阶段性的执行刷新命令(refresh table MQT_table)时才会进行刷新。这种方式适合用在绝大部分时间都是只读的应用系统中,或者数据的更新只发生维护窗口时间。

      MQT刷新的方式还可以从数据的刷新范围进行分类,一是完全刷新,二是增量刷新。完全刷新是将基表中的所有数据重新进行计算和处理从而更新MQT数据。这种方式的缺点是当基表数据量大而且MQT定义复杂的时候,刷新过程会比较慢。增量更新方式是针对CRUD等操作更新过的数据的那一部分数据,对MQT中相应的数据进行刷新,而不需要访问及表中的所有数据。

      结合起来,即时更新方式就是增量刷新方式,延迟刷新方式采用的是完全刷新,除了一种特殊的延迟刷新--->staging table 的延迟更新。当MQT的基表被修改时,变化就会传播进来,添加到staging table中,这样就利用staging table做增量刷新。当刷新操作完成时,staging table中的数据就会被删除。

    即时刷新:

      创建DB ,创建table

      db2start 

      db2 => create db mydb
      DB20000I CREATE DATABASE 命令成功完成。
      db2 => connect to mydb

      数据库连接信息

      数据库服务器 = DB2/NT64 10.5.5
      SQL 授权标识 = JOINT
      本地数据库别名 = MYDB

      db2 => create table dbtable(id int not null primary key,c int,d int,e int)
      DB20000I SQL 命令成功完成。
      db2 => insert into dbtable values(1,1,1,1),(2,2,2,2),(3,3,3,3),(4,4,4,4),(5,5,5,5)
      DB20000I SQL 命令成功完成。
      db2 => select * from dbtable

      ID C D E
    ----------- ----------- ----------- -----------
      1 1 1 1
      2 2 2 2
      3 3 3 3
      4 4 4 4
      5 5 5 5

      5 条记录已选择。

      db2 => insert into dbtable values(11,11,11,11),(12,12,12,12),(13,13,13,13),(14,14,41,41),(15,15,51,51)
      DB20000I SQL 命令成功完成。
      db2 => select * from dbtable

      ID C D E
    ----------- ----------- ----------- -----------
      1 1 1 1
      2 2 2 2
      3 3 3 3
      4 4 4 4
      5 5 5 5
      11 11 11 11
      12 12 12 12
      13 13 13 13
      14 14 41 41
      15 15 51 51

      10 条记录已选择。

      创建MQT

      db2 => create table mqttab as (select id,c,d,e from dbtable where id > 10) data initially deferred refresh immediate
      DB20000I SQL 命令成功完成。

      当前创建完毕之后,表里面还没有数据,查询为空。在操作一个基表

      db2 => insert into dbtable values(111,111,111,11)

      再次查询MQT 表就有数据了

      db2 => select * from mqttab

      ID C D E
    ----------- ----------- ----------- -----------
      11 11 11 11
      12 12 12 12
      13 13 13 13
      14 14 41 41
      15 15 51 51
      111 111 111 11

      6 条记录已选择。

      db2 => insert into dbtable values(121,222,222,1)
      DB20000I SQL 命令成功完成。
      db2 => select * from mqttab

      ID C D E
    ----------- ----------- ----------- -----------
      11 11 11 11
      12 12 12 12
      13 13 13 13
      14 14 41 41
      15 15 51 51
      111 111 111 11
      121 222 222 1

      7 条记录已选择。

      这就的即时的刷新。基表操作更新,MQT表即时进行更新。一下子操作两个表,负荷量较大。

    延迟刷新

      创建table

      db2 => create table dbtable1(id int not null primary key,c int,d int,e int)
      DB20000I SQL 命令成功完成。
      db2 => insert into dbtable1 values(1,1,1,1),(2,2,2,2),(3,3,3,3),(4,4,4,4),(5,5,5,5)
      DB20000I SQL 命令成功完成。
      db2 => create table mqttab1 as (select id,c,d,e from dbtable1 where id > 10) data initially deferred refresh deferred
      DB20000I SQL 命令成功完成。

      创建完毕,插入基表数据。

      db2 => insert into dbtable1 values(111,111,11,111)

      mqt查询为空。

      db2 => select * from mqttab1

      ID C D E
    ----------- ----------- ----------- -----------

      延迟刷新命令:

      db2 => refresh table mqttabl
      DB20000I SQL 命令成功完成。
      db2 => select * from mqttabl

      ID C D E
    ----------- ----------- ----------- -----------
      111 111 11 111

      1 条记录已选择。

    就即时刷新和延迟刷新做了一个实例。不足请提出,共同进步!谢谢

  • 相关阅读:
    SQL Server 实现Split函数
    15.java设计模式之访问者模式
    14.java设计模式之命令模式
    13.java设计模式之模板模式
    12.java设计模式之代理模式
    11.java设计模式之享元模式
    10.java设计模式之外观模式
    9.java设计模式之组合模式
    8.java设计模式之装饰者模式
    7.java设计模式之桥接模式
  • 原文地址:https://www.cnblogs.com/why-home/p/11811594.html
Copyright © 2020-2023  润新知