Informix 数据仓库加速器原理与实践,第 5 部分: 数据集市的部分更新

Informix数据库一直是业界领先的联机事务处理OLTP数据库,针对Informix用户日益增长的数据仓库、商业智能方面的需求,在Informix数据库中融入了很多业界领先的数据仓库特性,使Informix不仅能够处理OLTP应用,现在也可以高效处理数据仓库以及OLTP/Warehousing混合负载,提供强大的数据仓库处理能力,并且专门推出了新的Informix 数据仓库版本Informix Ultimate Warehouse Edition,用来构建基于Informix数据仓库。为进一步提高Informix 数据仓库查询的性能,从Informix 11.7xC2开始,推出了专门针对数据仓库应用的数据仓库加速器IWA(Informix Warehouse Aaccelerator),它将需要分析的数据集市数据经过压缩、频度分区技术全部保存在内存中,消除了磁盘I/O;数据在内存中按照“列”方式存储,减少了数据扫描量,显著提高了OLAP查询的性能。本文,作为“Informix数据仓库加速器原理与实践”系列文章的第五部分,具体为大家介绍了Informix数据仓库加速器的“数据集市的部分更新”功能及基本使用方法,当用户事实表或维表数据发生变化时,我们不再需要刷新整个数据集市,只需刷新发生变化的表或表分区,实现了数据增量加载功能,大大提高了数据加载的效率。

张光业, 技术支持工程师, IBM

张光业,目前在 IBM 软件部工作,主要负责开发商在数据库和数据仓库方面产品的技术支持和培训,在 IT 行业有丰富的工作经验。是 IBM 认证的 DB2 UDB 高级技术专家。



2011 年 11 月 03 日

免费下载:IBM® Informix® 11.7 试用版(包括 Ultimate Edition、Developer Edition 和 Innovator-C Edition)
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

正如我们前边所介绍的,我们可以将用户数据集市的数据装载到IWA中来极大地加速数查询的效率。在过去的版本中,IWA仅支持数据集市的全量刷新,当用户事实表或维表数据发生变化时,我们需要全量刷新整个数据集市,对于数据量比较大的数据集市,全量刷新可能需要花费较长的时间,甚至可能会超过用户允许的数据装载时间窗口,这对用户来说是一个比较大的挑战。针对上述问题,从Informix Ultimate Warehouse Edition 11.7FC5开始,IWA提供了“数据集市的部分更新”能力,当用户事实表或维表数据发生变化时,我们不需要全量刷新整个数据集市,只需刷新发生变化的事实表或维表。通常,用户的数据仓库系统,或者针对大数据量的表都会采用表分区技术来提高数据处理性能,比较常见的是将事实表定义为分区表,有时也会将数据量比较大的维表定义为分区表,当用户事实表或者维表中的数据发生变化时,我们也不需要将全部事实表或维表数据进行刷新,只需要将发生数据变化的分区进行刷新,这样,将显著提高IWA数据集市数据刷新的效率,满足用户对实时数据分析的需求。

“数据集市的部分更新”包括partition refresh 和 table refresh 两方面:

  • partition refresh:在数据集市中,很多情况下较大的事实表是分区表。当分区表中某个分区的数据发生变化时,只需更新该分区。
  • table refresh:在数据集市中,很多情况下维表和较小的事实表是非分区表。若非分区表发生了变化,只需更新该表而不涉及其它表。

下边,我们以一个配置示例来具体介绍一下“数据集市的部分更新”的使用方法,希望能够对大家有所帮助。

本次示例,我们创建了ds2数据库作为数据仓库系统,并创建了shop及goods维表,salecost事实表来实现销售分析。

创建数据仓库系统

正如我们前边所介绍的,Informix 11.7 中融入了XPS 及 Red Brick 中优秀的数据仓库特性,使Informix 不仅能够处理OLTP应用,现在也可以高效处理数据仓库以及OLTP/Warehousing混合负载,提供强大的数据仓库处理能力。针对数据仓库数据存储,我们可以利用Informix数据库提供的Interval Fragmentation技术来实现基于时间的数据分区自动维护功能,数据仓库往往是时间相关的,Interval Fragmentation技术可以不需要事先创建基于时间的数据分区,而是在数据加载过程中自动创建数据分区,极大地减少了数据维护的费用。

创建ds2数据库

本次示例,我们首先创建了ds2数据库作为Informix数据仓库数据库,如下所示:

清单 1. 创建ds2数据库
informix@informixva[demo_on]:~$ dbaccess <<!
> create database ds2 with log;
> !
Database created.
Database closed.

之后,我们需要创建shop、goods维表及salecost事实表来实现销售分析。

创建shop维表

针对shop维表,由于数据量比较小,因此,我们不采用分区表,如下所示:

清单 2. 创建shop维表
create table "informix".shop 
  (
    id char(4) not null ,
    rationshopid char(4),
    shopaddress char(64),
    name char(64),
    shopip char(15) not null ,
    shoptype integer,
    rate smallint 
        default 100 not null ,
    margindroplimit decimal(12,2) 
        default 0.00 not null ,
    marginrate decimal(5,2) 
        default 0.00 not null ,
    linktele char(32),
    connecttele char(32),
    connecttype smallint 
        default 0 not null ,
    headid char(4),
    ifshopgroup smallint 
        default 0 not null ,
    selfjsflag smallint 
        default 0 not null ,
    enable smallint 
        default 1 not null ,
    dcflag smallint 
        default 0 not null ,
    closeflag integer 
        default 0 not null ,
    rationflag smallint 
        default 0 not null ,
    shopcode char(5),
    cbflag smallint 
        default 0,
    primary key (id) 
  ) lock mode row;

创建goods维表

针对goods维表,由于数据量较大,我们采用分区表来提高数据存储容量及数据处理效率。Informix提供了丰富的表分区技术,但是,以前的版本,在数据装载之前,我们需要事先创建分区;由于数据仓库系统,不仅要保存当前数据,还要保存历史数据,数据往往会随着时间的推移不断积累,这就要求我们需要不断地改变表结构来创建新的分区,维护成本会很高。为了解决上述问题,特别是针对数据仓库系统,我们可以利用Informix数据库提供的Interval Fragmentation技术来实现基于时间的数据分区自动维护功能,数据仓库往往是时间相关的,Interval Fragmentation技术可以不需要事先创建基于时间的数据分区,而是在数据加载过程中自动创建数据分区,极大地减少了数据维护的费用。

Interval Fragmentation基本语法如下边所示:

清单 3. Interval Fragmentation基本语法
FRAGMENT BY RANGE (column_expr) 
      INTERVAL (interval_size) STORE IN (dbspace_list)
         PARTITION partition VALUES <  upper_bound IN dbspace,
         . . . 
         PARTITION partition VALUES <  upper_bound IN dbspace,
         PARTITION partition VALUES IS NULL IN dbspace

其中:

RANGE(column_expr)

该column_expr列表达式用来定义分区键(fragment key ),它只能包含一个数据列,而且数据类型必须是数值类型、DATETIME或者 DATE。该子句是必须的。

INTERVAL(interval_size)

该interval_size用来指定informix数据库自动生成表分区所支持的分区键数据范围。interval_size数据类型由分区键数据类型决定:

  • 如果分区键数据类型是数值类型,interval_size数据类型也要是数值类型。interval_size表达式必须是常量表达式,而且其数值要大于0,不能够带小数位。
  • 如果分区键数据类型是DATE 或DATETIME,interval_size表达式必须要评估为INTERVAL数值,INTERVAL interval_size表达式必须是常量表达式,而且其数值要大于0,不能够带小数位。

interval_size表达式最小值由分区键数据类型决定:

  • 如果分区键数据类型是DATETIME,interval_size表达式最小值为秒。
  • 如果分区键数据类型是DATE,interval_size表达式最小值为天。
  • 如果分区键数据类型是数值类型,interval_size表达式最小值为1。

我们可以使用数值或INTERVAL数值来定义interval_size表达式,如下边所示:

清单 4. 定义interval_size表达式
FRAGMENT BY RANGE (integer_col) 
      INTERVAL (1000) STORE IN (dbspace_list)
         PARTITION partition VALUES <  upper_bound IN dbspace,
         . . . 
FRAGMENT BY RANGE (date_col) 
      INTERVAL (1 units day) STORE IN (dbspace_list)
         PARTITION partition VALUES <  upper_bound IN dbspace,
         . . . 
FRAGMENT BY RANGE (datetime_col) 
      INTERVAL (1 units second) STORE IN (dbspace_list)
         PARTITION partition VALUES <  upper_bound IN dbspace,
         . . .

我们也可以使用NUMTODSINTERVAL,NUMTOYMINTERVAL,TO_DSINTERVAL及TO_YMINTERVAL函数来定义interval_size表达式,如下边所示:

清单 5. 使用NUMTODSINTERVAL,NUMTOYMINTERVAL函数定义interval_size表达式
定义时间间隔为1天:
TO_DSINTERVAL('1 00:00:00')
TO_DSINTERVAL(1,'DAY')
NUMTODSINTERVAL(1,'DAY')

定义时间间隔为1小时:
TO_DSINTERVAL('0 01:00:00')
TO_DSINTERVAL(1,'HOUR')
NUMTODSINTERVAL(1,'HOUR')

定义时间间隔为1分钟30秒:
TO_DSINTERVAL('0 00:01:30')
TO_DSINTERVAL(1.5,'MINUTE')
NUMTODSINTERVAL(1.5,'MINUTE')

定义时间间隔为1年:
TO_YMINTERVAL('01-00')
TO_YMINTERVAL(1,'YEAR')
NUMTOYMINTERVAL(1,'YEAR')

定义时间间隔为1个月:
TO_YMINTERVAL('00-01')
TO_YMINTERVAL(1,'MONTH')
NUMTOYMINTERVAL(1,'MONTH')

定义时间间隔为1.5 年:
TO_YMINTERVAL('01-06')
TO_YMINTERVAL(1.5,'YEAR')
NUMTOYMINTERVAL(1.5,'YEAR')

该子句是必须的。

如果没有定义interval_size表达式,自动创建interval fragments功能将被禁止。但是在定义表结构时,INTERVAL ()仍然需要,以避免语法错误。

STORE IN(dbspace_list)

该dbspace_list数据库空间列表用来指定interval fragments 所使用的数据库空间列表。如果指定多个数据库空间,informix会以round robin轮询的方式分配系统新创建的interval fragments到这些数据库空间上。该子句是可选的。

如果没有指定该子句,informix会将系统新创建的interval fragments分配到range fragment子句指定的数据库空间上。如果定义了多个range fragments,而且分布在不同的数据库空间上,informix会以round robin轮询的方式分配系统新创建的interval fragments到这些数据库空间上。

PARTITION partition

该子句用来定义range 或 NULL fragment。我们必须至少定义一个range fragment。NULL fragment 是可选的,但是不能定义多个 NULL fragment。

VALUES < upper_bound

该子句用来定义分区表达式。当我们定义多个range fragment时,upper_bound 值要以升序指定。该子句是必须的。

我们定义的最后一个range fragment 被称为transition fragment,其 upper bound 被称为transition value。当插入的记录超过定义的分区键值时,该记录会保存在系统自动创建的interval fragment中。

VALUES IS NULL

该子句用来定义NULL fragment。如果没有定义NULL fragment,当我们插入一条记录时,如果没有包含分区键值,系统将会报错。

当我们插入数据的分区键值超过定义的分区范围后,informix数据库会根据interval_size值自动创建新的interval fragment 来保存该数据,不需要DBA的干预,极大地减轻了数据库维护的工作量。

针对goods维表,我们指定vgno为fragment key,由于vgno为integer数据类型,我们定义interval_size为100000,如下边所示:

清单 6. 创建goods维表
create table "informix".goods 
  (
    vgno integer not null ,
    goodsno char(13) not null ,
    gname char(32) not null ,
    ename char(32),
    deptid integer not null ,
    kindid integer 
        default 0 not null ,
    uname char(8) not null ,
    spec char(16),
    bmatr char(10),
    package char(8),
    colorsizeflag integer 
        default 0 not null ,
    pricerate smallint 
        default 1 not null ,
    price decimal(10,2) not null ,
    cost decimal(12,4) 
        default 0.0000 not null ,
    wprice decimal(10,2),
    supplyid integer not null ,
    paytypeid char(2) not null ,
    bbdate smallint,
    bldate smallint,
    taxrate decimal(4,2) 
        default 17.00 not null ,
    saletaxrate decimal(4,2) 
        default 17.00 not null ,
    season char(12),
    goodstypeid integer 
        default 0 not null ,
    runtype smallint 
        default 0 not null ,
    origin char(10),
    brandid integer 
        default 0 not null ,
    editor char(8) not null ,
    gdate date not null ,
    freshdays smallint,
    keepdays smallint,
    lowtemp decimal(4,1) 
        default 15.0 not null ,
    hightemp decimal(4,1) 
        default 28.0 not null ,
    relativehumidity smallint 
        default 65 not null ,
    ycomp char(20),
    saleflag smallint 
        default 0 not null ,
    pknum decimal(12,3) 
        default 1.000 not null ,
    pkgoodsno char(13),
    logistics smallint 
        default 1 not null ,
    needpurchase smallint 
        default 1 not null ,
    modifycost smallint 
        default 0 not null ,
    margindroplimit decimal(12,2) 
        default 0.00 not null ,
    marginrate decimal(5,2) 
        default 0.00 not null ,
    maxcost decimal(12,4) 
        default 0.0000 not null ,
    minprice decimal(10,2) 
        default 0.00 not null ,
    maxprice decimal(10,2) 
        default 0.00 not null ,
    trydays smallint 
        default 30 not null ,
    trysalevalue decimal(12,2) 
        default 0.00 not null ,
    placeid integer 
        default 0 not null ,
    customno char(16),
    pklsize smallint 
        default 0 not null ,
    pkwsize smallint 
        default 0 not null ,
    pkhsize smallint 
        default 0 not null ,
    zyflag smallint 
        default 0 not null ,
    pretrydays smallint 
        default 0,
    promflag smallint 
        default 0 not null ,
    firstorderdate date,
    discontinueddate date,
    pickflag integer 
        default 0,
    preciousflag integer 
        default 0,
    breakflag integer 
        default 0,
    
    check (pricerate > 0 ),
    primary key (vgno) 
  ) 
 FRAGMENT BY RANGE (vgno) 
       INTERVAL (100000) STORE IN (rootdbs)
             PARTITION p0 VALUES <  200000 IN rootdbs,
             PARTITION p1 VALUES <  400000 IN rootdbs,
             PARTITION p2 VALUES <  600000 IN rootdbs,
             PARTITION p3 VALUES <  820000 IN rootdbs
lock mode row;

创建salecost事实表

针对salecost事实表,同样,我们采用分区表。我们指定sdate为fragment key, 由于sdate为DATE类型,我们使用NUMTODSINTERVAL(1,'DAY') 函数来定义interval_size表达式为1 DAY,如下边所示:

清单 7. 创建salecost事实表
create table "informix".salecost
  (
    sdate date not null ,
    shopid char(4) not null ,
    deptid integer not null ,
    supplyid integer not null ,
    paytypeid char(2) not null ,
    vgno integer not null ,
    colorsize integer 
        default 0 not null ,
    qty decimal(12,3) 
        default 0.000 not null ,
    cost decimal(12,4) 
        default 0.0000 not null ,
    avgcost decimal(16,6) 
        default 0.000000 not null ,
    rebaterate decimal(5,2) 
        default 0.00 not null ,
    taxrate decimal(4,2) 
        default 17.00 not null ,
    saletaxrate decimal(4,2) 
        default 17.00 not null ,
    salevalue decimal(12,2) 
        default 0.00 not null ,
    discountvalue decimal(12,2) 
        default 0.00 not null ,
    vipdiscvalue decimal(12,2) 
        default 0.00 not null ,
    sheettype integer 
        default 101 not null ,
    marginrate decimal(5,2) 
        default 0.00 not null ,
    precost decimal(12,4),
    intercost decimal(12,4),
    exdiscvalue decimal(12,2) 
        default 0.00 not null ,
    flag integer 
        default 0 not null ,
    zyflag smallint 
        default 0 not null ,
    logistics smallint 
        default 0 not null ,
    saleflag smallint 
        default 0 not null ,
    runtype smallint 
        default 0 not null 
  ) 
FRAGMENT BY RANGE (sdate )
   INTERVAL (NUMTODSINTERVAL(1,'DAY')) STORE IN (rootdbs)
   PARTITION p0 VALUES <  DATE ('2012-01-01') IN rootdbs      
    extent size 250000 next size 250000 lock mode row;

注册与部分更新特性相关的函数

在Informix Ultimate Warehouse Edition 中,部分更新功能是通过dropPartMart() 和 loadPartMart()两个函数实现的,在使用之前,我们需要在数据库中注册这些函数。如下边所示:

清单 8. 注册与部分更新特性相关的函数
$ dbaccess ds2 $INFORMIXDIR/etc/boot1170XC5iwa.sql

创建IWADEMO实例及IWADEMO数据集市

我们可以采用IBM Smart Analytics Optimizer (ISAO)图形化工具来创建Informix数据仓库加速器实例及IWADEMO 数据集市,我们也可以采用JAVA CLI 命令行来创建Informix数据仓库加速器实例及IWADEMO 数据集市。本次示例,我们采用Java CLI 命令行来创建Informix数据仓库加速器实例及IWADEMO 数据集市。

首先,我们需要为Java CLI创建连接属性文件,该文件包含了连接数据库的相关信息。如下边所示,我们创建conn.prop文件,并设置了连接ds2数据库相关的信息。

清单 9. 创建连接属性文件
informix@informixva[demo_on]:~/test$ cat conn.prop 
driver=com.informix.jdbc.IfxDriver
URL=jdbc:informix-sqli://localhost:9088/ds2:INFORMIXSERVER=demo_on
user=informix
passwd=informix
informix@informixva[demo_on]:~/test$

接下来,我们需要为Java CLI设置如下环境变量,如下边所示:

清单 10. 为Java CLI设置环境变量
export CLASSPATH=${INFORMIXDIR}/dwa/example/cli/dwacli.jar:${CLASSPATH}
export CLASSPATH=${INFORMIXDIR}/jdbc/lib/ifxjdbc.jar:${CLASSPATH}
export PATH=${INFORMIXDIR}/extend/krakatoa/jre/bin:${PATH}

创建IWADEMO实例

在创建IWADEMO实例之前,我们需要运行“ondwa getpin”命令来获取数据仓库加速器的IP地址, 端口号及PIN号码。如下面所示,我们以root用户运行 “ondwa getpin”命令获取到IWA当前的IP地址, 端口号及PIN号码为:127.0.0.1 21022 3732。

清单 11. 运行ondwa getpin命令
root@informixva[demo_on]:/data/IBM/informix/dwa/demo# ondwa getpin
 127.0.0.1 21022 3732
root@informixva[demo_on]:/data/IBM/informix/dwa/demo#

之后,我们可以通过执行java setupDWA 命令创建IWADEMO数据仓库加速器实例,如下边所示:

清单 12. 执行java setupDWA 命令创建IWADEMO实例
$java setupDWA IWADEMO 127.0.0.1 21022 3732

创建IWADEMO 数据集市

接下来,我们通过执行java createMart 命令创建IWADEMO数据集市,如下边所示:

清单 13. 执行java createMart 命令创建IWADEMO数据集市
$java createMart IWADEMO salecost.xml
createMart IWADEMO salecost.xml
--------------------------------------------------------------------------------
result message:
 <dwa:messageOutput xmlns:dwa="http://www.ibm.com/xmlns/prod/dwa" version="1.0">
 <message severity="informational" reason-code="AQT10000I">
<text>The operation was completed successfully.</text>
</message>
</dwa:messageOutput>
===================================================================

其中,salecost.xml为IWADEMO数据集市定义信息,如下边所示:

清单 14. IWADEMO数据集市定义信息
<aqtmart:martModel xmlns:aqtmart="http://www.ibm.com/xmlns/prod/dwa" version="1.0">
  <mart name="IWADEMO">
    <table name="shop" schema="informix" >
      <column dataType="CHAR" name="id" nullable="false" precision="4"/>
      <column dataType="CHAR" name="rationshopid" nullable="true" precision="4"/>
      <column dataType="CHAR" name="shopaddress" nullable="true" precision="64"/>
      <column dataType="CHAR" name="name" nullable="true" precision="64"/>
      <column dataType="CHAR" name="shopip" nullable="false" precision="15"/>
      <column dataType="INTEGER" name="shoptype" nullable="true"/>
      <column dataType="SMALLINT" name="rate" nullable="false"/>
      <column dataType="DECIMAL" name="margindroplimit" nullable="false"
 precision="12" scale="2"/>
      <column dataType="DECIMAL" name="marginrate" nullable="false"
 precision="5" scale="2"/>
      <column dataType="CHAR" name="linktele" nullable="true" precision="32"/>
      <column dataType="CHAR" name="connecttele" nullable="true" precision="32"/>
      <column dataType="SMALLINT" name="connecttype" nullable="false"/>
      <column dataType="CHAR" name="headid" nullable="true" precision="4"/>
      <column dataType="SMALLINT" name="ifshopgroup" nullable="false"/>
      <column dataType="SMALLINT" name="selfjsflag" nullable="false"/>
      <column dataType="SMALLINT" name="enable" nullable="false"/>
      <column dataType="SMALLINT" name="dcflag" nullable="false"/>
      <column dataType="INTEGER" name="closeflag" nullable="false"/>
      <column dataType="SMALLINT" name="rationflag" nullable="false"/>
      <column dataType="CHAR" name="shopcode" nullable="true" precision="5"/>
      <column dataType="SMALLINT" name="cbflag" nullable="true"/>
    </table>
    <table name="salecost" schema="informix" >
      <column dataType="DATE" name="sdate" nullable="false"/>
      <column dataType="CHAR" name="shopid" nullable="false" precision="4"/>
      <column dataType="INTEGER" name="deptid" nullable="false"/>
      <column dataType="INTEGER" name="supplyid" nullable="false"/>
      <column dataType="CHAR" name="paytypeid" nullable="false" precision="2"/>
      <column dataType="INTEGER" name="vgno" nullable="false"/>
      <column dataType="INTEGER" name="colorsize" nullable="false"/>
      <column dataType="DECIMAL" name="qty" nullable="false" precision="12" scale="3"/>
      <column dataType="DECIMAL" name="cost" nullable="false" precision="12" scale="4"/>
      <column dataType="DECIMAL" name="avgcost" nullable="false"
 precision="16" scale="6"/>
      <column dataType="DECIMAL" name="rebaterate" nullable="false"
 precision="5" scale="2"/>
      <column dataType="DECIMAL" name="taxrate" nullable="false" 
precision="4" scale="2"/>
      <column dataType="DECIMAL" name="saletaxrate" nullable="false"
 precision="4" scale="2"/>
      <column dataType="DECIMAL" name="salevalue" nullable="false"
 precision="12" scale="2"/>
      <column dataType="DECIMAL" name="discountvalue" nullable="false"
 precision="12" scale="2"/>
      <column dataType="DECIMAL" name="vipdiscvalue" nullable="false"
 precision="12" scale="2"/>
      <column dataType="INTEGER" name="sheettype" nullable="false"/>
      <column dataType="DECIMAL" name="marginrate" nullable="false"
 precision="5" scale="2"/>
      <column dataType="DECIMAL" name="precost" nullable="true" 
precision="12" scale="4"/>
      <column dataType="DECIMAL" name="intercost" nullable="true"
 precision="12" scale="4"/>
      <column dataType="DECIMAL" name="exdiscvalue" nullable="false"
 precision="12" scale="2"/>
      <column dataType="INTEGER" name="flag" nullable="false"/>
      <column dataType="SMALLINT" name="zyflag" nullable="false"/>
      <column dataType="SMALLINT" name="logistics" nullable="false"/>
      <column dataType="SMALLINT" name="saleflag" nullable="false"/>
      <column dataType="SMALLINT" name="runtype" nullable="false"/>
    </table>
    <table name="goods" schema="informix" >
      <column dataType="INTEGER" name="vgno" nullable="false"/>
      <column dataType="CHAR" name="goodsno" nullable="false" precision="13"/>
      <column dataType="CHAR" name="gname" nullable="false" precision="32"/>
      <column dataType="CHAR" name="ename" nullable="true" precision="32"/>
      <column dataType="INTEGER" name="deptid" nullable="false"/>
      <column dataType="INTEGER" name="kindid" nullable="false"/>
      <column dataType="CHAR" name="uname" nullable="false" precision="8"/>
      <column dataType="CHAR" name="spec" nullable="true" precision="16"/>
      <column dataType="CHAR" name="bmatr" nullable="true" precision="10"/>
      <column dataType="CHAR" name="package" nullable="true" precision="8"/>
      <column dataType="INTEGER" name="colorsizeflag" nullable="false"/>
      <column dataType="SMALLINT" name="pricerate" nullable="false"/>
      <column dataType="DECIMAL" name="price" nullable="false" 
precision="10" scale="2"/>
      <column dataType="DECIMAL" name="cost" nullable="false" 
precision="12" scale="4"/>
      <column dataType="DECIMAL" name="wprice" nullable="true"
 precision="10" scale="2"/>
      <column dataType="INTEGER" name="supplyid" nullable="false"/>
      <column dataType="CHAR" name="paytypeid" nullable="false" precision="2"/>
      <column dataType="SMALLINT" name="bbdate" nullable="true"/>
      <column dataType="SMALLINT" name="bldate" nullable="true"/>
      <column dataType="DECIMAL" name="taxrate" nullable="false" 
precision="4" scale="2"/>
      <column dataType="DECIMAL" name="saletaxrate" nullable="false" 
precision="4" scale="2"/>
      <column dataType="CHAR" name="season" nullable="true" precision="12"/>
      <column dataType="INTEGER" name="goodstypeid" nullable="false"/>
      <column dataType="SMALLINT" name="runtype" nullable="false"/>
      <column dataType="CHAR" name="origin" nullable="true" precision="10"/>
      <column dataType="INTEGER" name="brandid" nullable="false"/>
      <column dataType="CHAR" name="editor" nullable="false" precision="8"/>
      <column dataType="DATE" name="gdate" nullable="false"/>
      <column dataType="SMALLINT" name="freshdays" nullable="true"/>
      <column dataType="SMALLINT" name="keepdays" nullable="true"/>
      <column dataType="DECIMAL" name="lowtemp" nullable="false"
 precision="4" scale="1"/>
      <column dataType="DECIMAL" name="hightemp" nullable="false" 
precision="4" scale="1"/>
      <column dataType="SMALLINT" name="relativehumidity" nullable="false"/>
      <column dataType="CHAR" name="ycomp" nullable="true" precision="20"/>
      <column dataType="SMALLINT" name="saleflag" nullable="false"/>
      <column dataType="DECIMAL" name="pknum" nullable="false" 
precision="12" scale="3"/>
      <column dataType="CHAR" name="pkgoodsno" nullable="true" precision="13"/>
      <column dataType="SMALLINT" name="logistics" nullable="false"/>
      <column dataType="SMALLINT" name="needpurchase" nullable="false"/>
      <column dataType="SMALLINT" name="modifycost" nullable="false"/>
      <column dataType="DECIMAL" name="margindroplimit" nullable="false" 
precision="12" scale="2"/>
      <column dataType="DECIMAL" name="marginrate" nullable="false" 
precision="5" scale="2"/>
      <column dataType="DECIMAL" name="maxcost" nullable="false" 
precision="12" scale="4"/>
      <column dataType="DECIMAL" name="minprice" nullable="false" 
precision="10" scale="2"/>
      <column dataType="DECIMAL" name="maxprice" nullable="false" 
precision="10" scale="2"/>
      <column dataType="SMALLINT" name="trydays" nullable="false"/>
      <column dataType="DECIMAL" name="trysalevalue" nullable="false" 
precision="12" scale="2"/>
      <column dataType="INTEGER" name="placeid" nullable="false"/>
      <column dataType="CHAR" name="customno" nullable="true"
 precision="16"/>
      <column dataType="SMALLINT" name="pklsize" nullable="false"/>
      <column dataType="SMALLINT" name="pkwsize" nullable="false"/>
      <column dataType="SMALLINT" name="pkhsize" nullable="false"/>
      <column dataType="SMALLINT" name="zyflag" nullable="false"/>
      <column dataType="SMALLINT" name="pretrydays" nullable="true"/>
      <column dataType="SMALLINT" name="promflag" nullable="false"/>
      <column dataType="DATE" name="firstorderdate" nullable="true"/>
      <column dataType="DATE" name="discontinueddate" nullable="true"/>
      <column dataType="INTEGER" name="pickflag" nullable="true"/>
      <column dataType="INTEGER" name="preciousflag" nullable="true"/>
      <column dataType="INTEGER" name="breakflag" nullable="true"/>
    </table>
    <reference dependentCardinality="n" dependentTableName="salecost" 
dependentTableSchema="informix" isRuntimeJoin="true" parentCardinality="1" 
parentTableName="shop" parentTableSchema="informix" 
referenceType="LEFTOUTER" >
      <parentColumn name="id"/>
      <dependentColumn name="shopid"/>
    </reference>
    <reference dependentCardinality="n" dependentTableName="salecost" 
dependentTableSchema="informix" isRuntimeJoin="true" parentCardinality="1" 
parentTableName="goods" parentTableSchema="informix" referenceType="LEFTOUTER" >
      <parentColumn name="vgno"/>
      <dependentColumn name="vgno"/>
    </reference>
  </mart>
</aqtmart:martModel>

装载IWADEMO 数据集市数据

我们通过执行java loadMart 命令装载IWADEMO数据集市数据,如下边所示:

清单 15. 装载IWADEMO数据集市数据
/opt/IBM/informix/dwa/example/cli# java loadMart IWADEMO IWADEMO NONE
loadMart IWADEMO IWADEMO NONE
--------------------------------------------------------------------------------
result message:
<dwa:messageOutput xmlns:dwa="http://www.ibm.com/xmlns/prod/dwa" version="1.0">
<message severity="informational" reason-code="AQT10000I">
<text>The operation was completed successfully.</text>
</message>
</dwa:messageOutput>
===================================================================

我们可以通过执行java listMarts 命令显示IWADEMO数据集市信息,如下边所示:

清单 16. 显示IWADEMO数据集市信息
/opt/IBM/informix/dwa/example/cli# java listMarts IWADEMO
listMarts IWADEMO
--------------------------------------------------------------------------------
result message:
<dwa:messageOutput xmlns:dwa="http://www.ibm.com/xmlns/prod/dwa" version="1.0"> 
<message severity="informational" reason-code="AQT10000I">
<text>The operation was completed successfully.</text>
</message>
</dwa:messageOutput>
--------------------------------------------------------------------------------
mart list:

<dwa:martList xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:dwa="http://www.ibm.com/xmlns/prod/dwa" version="1.0">
<mart name="IWADEMO" status="Active" memoryConsumptionInMB="115" 
lastLoadTimestamp="2012-06-04T00:04:02.380658Z"
 lastUpdateTimestamp="2012-05-07T23:34:43.192818Z" />
<mart name="dm1" status="Active" memoryConsumptionInMB="3" 
lastLoadTimestamp="2012-04-28T11:28:20.905733Z"
 lastUpdateTimestamp="2012-04-28T11:27:02.698287Z" />
</dwa:martList>
===================================================================

数据集市的部分更新

Salecost事实表的更新

增加数据集市数据

我们通过执行以下语句向salecost事实表中增加5条记录,如下边所示:

清单 17. 向salecost事实表中增加5条记录
 insert into salecost values('2012-05-10','S105',616703,27892,'11',562270,
 0,1,7,12,0,0,17,17,9.9,1,1,101,28.08,0,0,0,0,0,0,0);
 insert into salecost values('2012-05-10','S106',616703,27892,'11',562270,
 0,1,7,12,0,0,17,17,9.9,1,1,101,28.08,0,0,0,0,0,0,0);
 insert into salecost values('2012-05-10','S107',616703,27892,'11',562270,
 0,1,7,12,0,0,17,17,9.9,1,1,101,28.08,0,0,0,0,0,0,0);
 insert into salecost values('2012-05-10','S108',616703,27892,'11',562270,
 0,1,7,12,0,0,17,17,9.9,1,1,101,28.08,0,0,0,0,0,0,0);
 insert into salecost values('2012-05-10','S135',616703,27892,'11',562270,
 0,1,7,12,0,0,17,17,9.9,1,1,101,28.08,0,0,0,0,0,0,0);

由于上述5条记录日期为'2012-05-10',超出了salecost分区表预定义的分区范围,因此,informix会自动创建一个sys_p131分区来存放新增加的数据,我们可以通过执行oncheck –pt命令来查看新创建的分区,如下边所示:

清单 18. 执行oncheck –pt命令来查看新创建的分区
 informix@informixva[demo_on]:/data/software/scripts$oncheck -pt ds2:salecost 

TBLspace Report for ds2:informix.salecost

		  Table fragment partition p0 in DBspace rootdbs

    Physical Address               1:333446
    Creation date                  05/03/2012 23:05:43
    TBLspace Flags                 802        Row Locking
                                              TBLspace use 4 bit bit-maps
    Maximum row size               122       
    Number of special columns      0         
    Number of keys                 0         
    Number of extents              1         
    Current serial value           1         
    Current SERIAL8 value          1         
    Current BIGSERIAL value        1         
    Current REFID value            1         
    Pagesize (k)                   2         
    First extent size              125000    
    Next extent size               125000    
    Number of pages allocated      125000    
    Number of pages used           41134     
    Number of data pages           41123     
    Number of rows                 657958    
    Partition partnum              1049007   
    Partition lockid               1049007   

    Extents                       
         Logical Page     Physical Page        Size Physical Pages
                    0         1:1191983      125000     125000

		  Table fragment partition sys_p131 in DBspace rootdbs

    Physical Address               1:333513
    Creation date                  06/04/2012 01:49:38
    TBLspace Flags                 802        Row Locking
                                              TBLspace use 4 bit bit-maps
    Maximum row size               122       
    Number of special columns      0         
    Number of keys                 0         
    Number of extents              1         
    Current serial value           1         
    Current SERIAL8 value          1         
    Current BIGSERIAL value        1         
    Current REFID value            1         
    Pagesize (k)                   2         
    First extent size              125000    
    Next extent size               125000    
    Number of pages allocated      124896    
    Number of pages used           2         
    Number of data pages           1         
    Number of rows                 5         
    Partition partnum              1049074   
    Partition lockid               1049007   

    Extents                       
         Logical Page     Physical Page        Size Physical Pages
                    0         1:1317119      124896     124896

informix@informixva[demo_on]:/data/software/scripts$

通过oncheck –pt命令我们知道了新增加的数据存放在sys_p131分区中,这样,我们就可以通过执行java loadPartMart命令来增加新的数据到IWADEMO数据集市中,如下边所示:

清单 19. 执行java loadPartMart命令增加新的数据到IWADEMO数据集市
#java loadPartMart IWADEMO IWADEMO informix salecost sys_p131

loadPartMart IWADEMO IWADEMO informix salecost sys_p131
--------------------------------------------------------------------------------
result message:
<dwa:messageOutput xmlns:dwa="http://www.ibm.com/xmlns/prod/dwa" version="1.0">
 <message severity="informational" reason-code="AQT10000I">
<text>The operation was completed successfully.</text>
</message>
</dwa:messageOutput>
===================================================================

当刷新完分区数据后,我们就可以使用IWADEMO数据集市来加速数据查询。如下边所示,我们执行如下查询语句:

清单 20. 执行查询语句
set explain on; 
set environment use_dwa "1";
set PDQPRIORITY 100;
select a.ShopID,a.DeptID,
sum(a.Qty) Qty,sum(a.SaleValue) SaleValue,
sum(a.SaleValue-a.DiscountValue+a.ExDiscValue) RealValue,
sum((a.SaleValue-a.DiscountValue+a.ExDiscValue)/(1+a.saletaxrate/100)) NTRealValue,
sum(a.Qty*a.Cost) CostValue,
sum(a.Qty*a.Cost/(1+a.saletaxrate/100)) NTCostValue,sum(a.DiscountValue) DiscountValue,
sum(a.ExDiscValue) ExDiscValue,
sum(a.SaleValue-a.DiscountValue+a.ExDiscValue-a.Qty*a.Cost) MarginValue,
sum((a.SaleValue-a.DiscountValue+a.ExDiscValue-a.Qty*a.Cost)/
(1+a.saletaxrate/100)) NTMarginValue,
case sum(a.SaleValue-a.DiscountValue+a.ExDiscValue) 
when 0 then 0 else sum(a.SaleValue-a.DiscountValue+a.ExDiscValue-a.Qty*a.Cost)*100
/sum(a.SaleValue-a.DiscountValue+a.ExDiscValue) end MarginRate,
sum(case a.MarginRate when 100 then 0 else 
(a.Qty*a.Cost/(1-a.MarginRate/100)) end) PlanSaleValue,
sum(case a.MarginRate when 100 then 0 else 
(a.Qty*a.Cost/(1-a.MarginRate/100)/(1+a.saletaxrate/100)) end) NTPlanSaleValue 
from SaleCost a 
where a.SDate '2012-05-01' and '2012-05-31' 
group by ShopID,DeptID;
set explain off;

通过查看该查询语句的执行计划,如下边所示,我们可以看到,QUERY: DWA executed:(OPTIMIZATION TIMESTAMP: 06-04-2012 01:58:14),也就意味着该查询语句被重定向到IWA来加速查询。

清单 21. 查看查询语句的执行计划
QUERY: DWA executed:(OPTIMIZATION TIMESTAMP: 06-04-2012 01:58:14)
------
select a.ShopID,a.DeptID,
sum(a.Qty) Qty,sum(a.SaleValue) SaleValue,
sum(a.SaleValue-a.DiscountValue+a.ExDiscValue) RealValue,
sum((a.SaleValue-a.DiscountValue+a.ExDiscValue)/(1+a.saletaxrate/100)) NTRealValue,
sum(a.Qty*a.Cost) CostValue,
sum(a.Qty*a.Cost/(1+a.saletaxrate/100)) NTCostValue,sum(a.DiscountValue) DiscountValue,
sum(a.ExDiscValue) ExDiscValue,
sum(a.SaleValue-a.DiscountValue+a.ExDiscValue-a.Qty*a.Cost) MarginValue,
sum((a.SaleValue-a.DiscountValue+a.ExDiscValue-a.Qty*a.Cost)/
(1+a.saletaxrate/100)) NTMarginValue,
case sum(a.SaleValue-a.DiscountValue+a.ExDiscValue) 
when 0 then 0 else sum(a.SaleValue-a.DiscountValue+a.ExDiscValue-a.Qty*a.Cost)*100
/sum(a.SaleValue-a.DiscountValue+a.ExDiscValue) end MarginRate,
sum(case a.MarginRate when 100 then 0 
else (a.Qty*a.Cost/(1-a.MarginRate/100)) end) PlanSaleValue,
sum(case a.MarginRate when 100 then 0 
else (a.Qty*a.Cost/(1-a.MarginRate/100)/(1+a.saletaxrate/100)) end) NTPlanSaleValue 
from SaleCost a 
where a.SDate between '2012-05-01' and '2012-05-31' 
group by ShopID,DeptID

Estimated Cost: 157511
Estimated # of Rows Returned: 57756
Maximum Threads: 0

  1) ds2@IWADEMO:dwa.aqt0167d480-7d32-4de6-be29-fefeca9991cf: REMOTE PATH

    Remote SQL Request:
    {QUERY {FROM  dwa.aqt0167d480-7d32-4de6-be29-fefeca9991cf} {WHER
    E ({> = COL024 {DATE "819 2012-05-01" } } {< = COL024 {DATE "819 2
    012-05-31" } } )} {SELECT {SYSCAST COL025 AS CHAR 4 819} {SYSCAS
    T COL026 AS INTEGER} {SUM COL031 } {SUM COL037 } {SUM {+ {- COL0
    37 COL038 } COL044 } } {SUM {/ {SYSCAST {+ {- COL037 COL038 } CO
    L044 }  AS DOUBLE} { CASE  OF {WHEN {= {+ 1.0000000000000000 {/ 
    {SYSCAST COL036  AS DOUBLE} { CASE  OF {WHEN {= 100.000000000000
    0000  0 } NULL } ELSE 100.0000000000000000 }} }  0 } NULL } ELSE
     {+ 1.0000000000000000 {/ {SYSCAST COL036  AS DOUBLE} { CASE  OF
     {WHEN {= 100.0000000000000000  0 } NULL } ELSE 100.000000000000
    0000 }} } }} } {SUM {* COL031 COL032 } } {SUM {/ {SYSCAST {* COL
    031 COL032 }  AS DOUBLE} { CASE  OF {WHEN {= {+ 1.00000000000000
    00 {/ {SYSCAST COL036  AS DOUBLE} { CASE  OF {WHEN {= 100.000000
    0000000000  0 } NULL } ELSE 100.0000000000000000 }} }  0 } NULL 
    } ELSE {+ 1.0000000000000000 {/ {SYSCAST COL036  AS DOUBLE} { CA
    SE  OF {WHEN {= 100.0000000000000000  0 } NULL } ELSE 100.000000
    0000000000 }} } }} } {SUM COL038 } {SUM COL044 } {SUM {- {+ {- C
    OL037 COL038 } COL044 } {* COL031 COL032 } } } {SUM {/ {SYSCAST 
    {- {+ {- COL037 COL038 } COL044 } {* COL031 COL032 } }  AS DOUBL
    E} { CASE  OF {WHEN {= {+ 1.0000000000000000 {/ {SYSCAST COL036 
     AS DOUBLE} { CASE  OF {WHEN {= 100.0000000000000000  0 } NULL }
     ELSE 100.0000000000000000 }} }  0 } NULL } ELSE {+ 1.0000000000
    000000 {/ {SYSCAST COL036  AS DOUBLE} { CASE  OF {WHEN {= 100.00
    00000000000000  0 } NULL } ELSE 100.0000000000000000 }} } }} } {
     CASE  OF {WHEN {= {SUM {+ {- COL037 COL038 } COL044 } } 0 } 0 }
      ELSE {/ {SYSCAST {* {SUM {- {+ {- COL037 COL038 } COL044 } {* 
    COL031 COL032 } } } 100.0000000000000000 }  AS DOUBLE} { CASE  O
    F {WHEN {= {SUM {+ {- COL037 COL038 } COL044 } }  0 } NULL } ELS
    E {SUM {+ {- COL037 COL038 } COL044 } } }} }{SUM { CASE  OF {WHE
    N {= COL041 100 } 0 }  ELSE {/ {SYSCAST {* COL031 COL032 }  AS D
    OUBLE} { CASE  OF {WHEN {= {- 1.0000000000000000 {/ {SYSCAST COL
    041  AS DOUBLE} { CASE  OF {WHEN {= 100.0000000000000000  0 } NU
    LL } ELSE 100.0000000000000000 }} }  0 } NULL } ELSE {- 1.000000
    0000000000 {/ {SYSCAST COL041  AS DOUBLE} { CASE  OF {WHEN {= 10
    0.0000000000000000  0 } NULL } ELSE 100.0000000000000000 }} } }}
     }} {SUM { CASE  OF {WHEN {= COL041 100 } 0 }  ELSE {/ {SYSCAST 
    {/ {SYSCAST {* COL031 COL032 }  AS DOUBLE} { CASE  OF {WHEN {= {
    - 1.0000000000000000 {/ {SYSCAST COL041  AS DOUBLE} { CASE  OF {
    WHEN {= 100.0000000000000000  0 } NULL } ELSE 100.00000000000000
    00 }} }  0 } NULL } ELSE {- 1.0000000000000000 {/ {SYSCAST COL04
    1  AS DOUBLE} { CASE  OF {WHEN {= 100.0000000000000000  0 } NULL
     } ELSE 100.0000000000000000 }} } }}  AS DOUBLE} { CASE  OF {WHE
    N {= {+ 1.0000000000000000 {/ {SYSCAST COL036  AS DOUBLE} { CASE
      OF {WHEN {= 100.0000000000000000  0 } NULL } ELSE 100.00000000
    00000000 }} }  0 } NULL } ELSE {+ 1.0000000000000000 {/ {SYSCAST
     COL036  AS DOUBLE} { CASE  OF {WHEN {= 100.0000000000000000  0 
    } NULL } ELSE 100.0000000000000000 }} } }} }} } {GROUP COL025 CO
    L026 } }                                                        

QUERY: IDS FYI:(OPTIMIZATION TIMESTAMP: 06-04-2012 01:58:14)
------
select a.ShopID,a.DeptID,
sum(a.Qty) Qty,sum(a.SaleValue) SaleValue,
sum(a.SaleValue-a.DiscountValue+a.ExDiscValue) RealValue,
sum((a.SaleValue-a.DiscountValue+a.ExDiscValue)/(1+a.saletaxrate/100)) NTRealValue,
sum(a.Qty*a.Cost) CostValue,
sum(a.Qty*a.Cost/(1+a.saletaxrate/100)) NTCostValue,sum(a.DiscountValue) DiscountValue,
sum(a.ExDiscValue) ExDiscValue,
sum(a.SaleValue-a.DiscountValue+a.ExDiscValue-a.Qty*a.Cost) MarginValue,
sum((a.SaleValue-a.DiscountValue+a.ExDiscValue-a.Qty*a.Cost)/
(1+a.saletaxrate/100)) NTMarginValue,
case sum(a.SaleValue-a.DiscountValue+a.ExDiscValue) 
when 0 then 0 else sum(a.SaleValue-a.DiscountValue+a.ExDiscValue-a.Qty*a.Cost)*100
/sum(a.SaleValue-a.DiscountValue+a.ExDiscValue) end MarginRate,
sum(case a.MarginRate when 100 then 0 
else (a.Qty*a.Cost/(1-a.MarginRate/100)) end) PlanSaleValue,
sum(case a.MarginRate when 100 then 0 
else (a.Qty*a.Cost/(1-a.MarginRate/100)/(1+a.saletaxrate/100)) end) NTPlanSaleValue 
from SaleCost a 
where a.SDate between '2012-05-01' and '2012-05-31' 
group by ShopID,DeptID

Estimated Cost: 157511
Estimated # of Rows Returned: 57756
Maximum Threads: 0
Temporary Files Required For: Group By 

  1) informix.a: SEQUENTIAL SCAN  (Parallel, fragments: 131)
     Fragments Scanned: (131) sys_p131 in rootdbs

     Filters: (informix.a.sdate < = 2012-05-31 AND informix.a.sdate > = 2012-05-01 )

更新数据集市数据

我们可以通过如下语句更新数据仓库中的数据,如下边所示:

清单 22. 更新数据仓库中的数据
update table salecost set qty=1000 where sdate='2012-05-10' and shopid='S105' and 
deptid=616703 and supplyid=27892 and paytypeid='11' and vgno=562270;

我们已经知道,日期为'2012-05-10'的数据保存在sys_p131分区上,如果不知道,我们同样可以通过oncheck –pt 或者通过查询sysfragment 系统表来查找到该数据所在的分区,这样,我们就可以执行dropPartMart及loadPartMart命令来更新分区数据。

从数据集市中删除分区sys_p131中的数据,如下边所示:

清单 23. 从数据集市中删除分区sys_p131中的数据
# java dropPartMart IWADEMO IWADEMO informix salecost sys_p131
dropPartMart IWADEMO IWADEMO informix salecost sys_p131
--------------------------------------------------------------------------------
result message:
<dwa:messageOutput xmlns:dwa="http://www.ibm.com/xmlns/prod/dwa" version="1.0">
 <message severity="informational" reason-code="AQT10000I">
<text>The operation was completed successfully.</text>
</message>
</dwa:messageOutput>
===================================================================

重新加载分区sys_p131的数据到数据集市,如下边所示:

清单 24. 重新加载分区sys_p131的数据到数据集市
# java loadPartMart IWADEMO IWADEMO informix salecost sys_p131
loadPartMart IWADEMO IWADEMO informix salecost sys_p131
--------------------------------------------------------------------------------
result message:
<dwa:messageOutput xmlns:dwa="http://www.ibm.com/xmlns/prod/dwa" version="1.0"> 
<message severity="informational" reason-code="AQT10000I">
<text>The operation was completed successfully.</text>
</message>
</dwa:messageOutput>
===================================================================

删除数据集市数据

同样,我们也可以通过dropPartMart命令删除不再需要的分区数据,如下边所示:

清单 25. 通过dropPartMart命令删除分区数据
# java dropPartMart IWADEMO IWADEMO informix salecost sys_p131
dropPartMart IWADEMO IWADEMO informix salecost sys_p131
--------------------------------------------------------------------------------
result message:
<dwa:messageOutput xmlns:dwa="http://www.ibm.com/xmlns/prod/dwa" version="1.0"> 
<message severity="informational" reason-code="AQT10000I">
<text>The operation was completed successfully.</text>
</message>
</dwa:messageOutput>
===================================================================

我们还需要执行如下命令删除数据仓库中相应的数据,如下边所示:

清单 26. 删除数据仓库中相应的数据
ALTER FRAGMENT ON TABLE salecost DETACH partition sys_p131 detacht1;

goods维表的更新

正如上边介绍的,goods维表由于数据量较大,我们也采用了表分区方式,该表相关的更新操作同Salecost事实表的更新基本相同。

增加数据集市数据

我们可以通过执行简单的insert语句向goods维表中增加vgno=900000的一条记录,根据goods维表的定义,我们知道,vgno=900000的记录超出了分区定义的范围,informix 会自动创建sys_p4分区来保存新增加的数据,我们可以通过oncheck –pt命令查看新增加的分区,如下边所示:

清单 27. 通过oncheck –pt命令查看新增加的分区
$ oncheck -pt ds2:goods

TBLspace Report for ds2:informix.goods

		  Table fragment partition p0 in DBspace rootdbs

    Physical Address               1:333418
    Creation date                  06/06/2012 02:45:45
    TBLspace Flags                 8802       Row Locking
                                              TBLspace use 4 bit bit-maps
    Maximum row size               370       
    Number of special columns      0         
    Number of keys                 0         
    Number of extents              8         
    Current serial value           1         
    Current SERIAL8 value          1         
    Current BIGSERIAL value        1         
    Current REFID value            1         
    Pagesize (k)                   2         
    First extent size              8         
    Next extent size               4096      
    Number of pages allocated      40960     
    Number of pages used           39983     
    Number of data pages           39973     
    Number of rows                 199864    
    Partition partnum              1048979   
    Partition lockid               1048979   

    Extents                       
         Logical Page     Physical Page        Size Physical Pages
                    0          1:334447       10240      10240
                10240          1:344695        6144       6144
                16384          1:350847        4096       4096
                20480          1:354951        4096       4096
                24576          1:359431        4096       4096
                28672          1:363655        4096       4096
                32768          1:477823        4096       4096
                36864          1:498303        4096       4096

		  Table fragment partition p1 in DBspace rootdbs

    Physical Address               1:333419
    Creation date                  06/06/2012 02:45:45
    TBLspace Flags                 8802       Row Locking
                                              TBLspace use 4 bit bit-maps
    Maximum row size               370       
    Number of special columns      0         
    Number of keys                 0         
    Number of extents              3         
    Current serial value           1         
    Current SERIAL8 value          1         
    Current BIGSERIAL value        1         
    Current REFID value            1         
    Pagesize (k)                   2         
    First extent size              8         
    Next extent size               4096      
    Number of pages allocated      40960     
    Number of pages used           40003     
    Number of data pages           39993     
    Number of rows                 199963    
    Partition partnum              1048980   
    Partition lockid               1048979   

    Extents                       
         Logical Page     Physical Page        Size Physical Pages
                    0          1:359047         384        384
                  384          1:363527         128        128
                  512          1:367751       40448      40448

		  Table fragment partition p2 in DBspace rootdbs

    Physical Address               1:333420
    Creation date                  06/06/2012 02:45:45
    TBLspace Flags                 8802       Row Locking
                                              TBLspace use 4 bit bit-maps
    Maximum row size               370       
    Number of special columns      0         
    Number of keys                 0         
    Number of extents              1         
    Current serial value           1         
    Current SERIAL8 value          1         
    Current BIGSERIAL value        1         
    Current REFID value            1         
    Pagesize (k)                   2         
    First extent size              8         
    Next extent size               4096      
    Number of pages allocated      40960     
    Number of pages used           40007     
    Number of data pages           39997     
    Number of rows                 199985    
    Partition partnum              1048981   
    Partition lockid               1048979   

    Extents                       
         Logical Page     Physical Page        Size Physical Pages
                    0          1:408199       40960      40960

		  Table fragment partition p3 in DBspace rootdbs

    Physical Address               1:333421
    Creation date                  06/06/2012 02:45:45
    TBLspace Flags                 8802       Row Locking
                                              TBLspace use 4 bit bit-maps
    Maximum row size               370       
    Number of special columns      0         
    Number of keys                 0         
    Number of extents              3         
    Current serial value           1         
    Current SERIAL8 value          1         
    Current BIGSERIAL value        1         
    Current REFID value            1         
    Pagesize (k)                   2         
    First extent size              8         
    Next extent size               4096      
    Number of pages allocated      45056     
    Number of pages used           43871     
    Number of data pages           43860     
    Number of rows                 219297    
    Partition partnum              1048982   
    Partition lockid               1048979   

    Extents                       
         Logical Page     Physical Page        Size Physical Pages
                    0          1:344687           8          8
                    8          1:449159       28664      28664
                28672          1:481919       16384      16384

		  Table fragment partition sys_p4 in DBspace rootdbs

    Physical Address               1:333431
    Creation date                  06/06/2012 03:18:45
    TBLspace Flags                 802        Row Locking
                                              TBLspace use 4 bit bit-maps
    Maximum row size               370       
    Number of special columns      0         
    Number of keys                 0         
    Number of extents              1         
    Current serial value           1         
    Current SERIAL8 value          1         
    Current BIGSERIAL value        1         
    Current REFID value            1         
    Pagesize (k)                   2         
    First extent size              8         
    Next extent size               8         
    Number of pages allocated      8         
    Number of pages used           2         
    Number of data pages           1         
    Number of rows                 1         
    Partition partnum              1048992   
    Partition lockid               1048979   

    Extents                       
         Logical Page     Physical Page        Size Physical Pages
                    0          1:635691           8          8

		  Index  107_160 fragment partition rootdbs in DBspace rootdbs

    Physical Address               1:333430
    Creation date                  06/06/2012 02:59:03
    TBLspace Flags                 802        Row Locking
                                              TBLspace use 4 bit bit-maps
    Maximum row size               370       
    Number of special columns      0         
    Number of keys                 1         
    Number of extents              1         
    Current serial value           1         
    Current SERIAL8 value          1         
    Current BIGSERIAL value        1         
    Current REFID value            1         
    Pagesize (k)                   2         
    First extent size              4         
    Next extent size               1024      
    Number of pages allocated      8192      
    Number of pages used           7784      
    Number of data pages           0         
    Number of rows                 0         
    Partition partnum              1048991   
    Partition lockid               1048979   

    Extents                       
         Logical Page     Physical Page        Size Physical Pages
                    0          1:627467        8192       8192

informix@informixva[demo_on]:~$

通过oncheck –pt命令我们知道了新增加的数据存放在sys_p4分区中,这样,我们就可以通过执行java loadPartMart命令来增加新的数据到IWADEMO数据集市中,如下边所示:

清单 28. 执行java loadPartMart命令装载数据
# java loadPartMart IWADEMO IWADEMO informix goods sys_p4
loadPartMart IWADEMO IWADEMO informix goods sys_p4
--------------------------------------------------------------------------------
result message:
<dwa:messageOutput xmlns:dwa="http://www.ibm.com/xmlns/prod/dwa" version="1.0"> 
<message severity="informational" reason-code="AQT10000I">
<text>The operation was completed successfully.</text>
</message>
</dwa:messageOutput>
===================================================================

更新数据集市数据

我们可以通过dropPartMart及loadPartMart命令来更新数据集市的数据。我们以更新goods维表p3分区为例:

从数据集市中删除分区p3中的数据,如下边所示:

清单 29. 从数据集市中删除分区p3中的数据
# java dropPartMart IWADEMO IWADEMO informix goods p3
dropPartMart IWADEMO IWADEMO informix goods p3
--------------------------------------------------------------------------------
result message:
<dwa:messageOutput xmlns:dwa="http://www.ibm.com/xmlns/prod/dwa" version="1.0">
 <message severity="informational" reason-code="AQT10000I">
<text>The operation was completed successfully.</text>
</message>
</dwa:messageOutput>
===================================================================

重新加载分区p3的数据到数据集市,如下边所示:

清单 30. 重新加载分区p3的数据到数据集市
# java loadPartMart IWADEMO IWADEMO informix goods p3
loadPartMart IWADEMO IWADEMO informix goods p3
--------------------------------------------------------------------------------
result message:
<dwa:messageOutput xmlns:dwa="http://www.ibm.com/xmlns/prod/dwa" version="1.0"> 
<message severity="informational" reason-code="AQT10000I">
<text>The operation was completed successfully.</text>
</message>
</dwa:messageOutput>
===================================================================

删除数据集市数据

同样,我们也可以通过dropPartMart命令删除不再需要的分区数据,如下边所示:

清单 31. 通过dropPartMart命令删除分区数据
# java dropPartMart IWADEMO IWADEMO informix goods sys_p4
dropPartMart IWADEMO IWADEMO informix goods sys_p4
--------------------------------------------------------------------------------
result message:
 <dwa:messageOutput xmlns:dwa="http://www.ibm.com/xmlns/prod/dwa" version="1.0">
 <message severity="informational" reason-code="AQT10000I">
<text>The operation was completed successfully.</text>
</message>
</dwa:messageOutput>
===================================================================

我们还需要执行如下命令删除数据仓库中相应的数据,如下边所示:

清单 32. 删除数据仓库中相应的数据
ALTER FRAGMENT ON TABLE goods DETACH partition sys_p4 detachtgoods;

shop维表的更新

shop维表数据量较少,我们没有采用表分区方式。在数据仓库环境中,维表通常都采用单表方式,仅仅针对数据量非常大的维表,我们会采用表分区方式。针对shop维表及数据仓库中的大部分维表,当数据发生增加、更新和删除时,我们会采用“表更新”方法仅将该表中的数据加载到IWA中。

增加、更新和删除数据集市数据

我们可以通过执行dropPartMart及loadPartMart命令来刷新shop维表数据到数据集市中,如下边所示:

从数据集市中删除shop维表的数据:

清单 33. 从数据集市中删除shop维表的数据
# java dropPartMart IWADEMO IWADEMO informix shop shop
dropPartMart IWADEMO IWADEMO informix shop shop
--------------------------------------------------------------------------------
result message:
<dwa:messageOutput xmlns:dwa="http://www.ibm.com/xmlns/prod/dwa" version="1.0">
 <message severity="informational" reason-code="AQT10000I">
<text>The operation was completed successfully.</text>
</message>
</dwa:messageOutput>
===================================================================

重新加载shop维表的数据到数据集市中:

清单 34. 重新加载shop维表的数据到数据集市
# java loadPartMart IWADEMO IWADEMO informix shop shop
loadPartMart IWADEMO IWADEMO informix shop shop
--------------------------------------------------------------------------------
result message:
 <dwa:messageOutput xmlns:dwa="http://www.ibm.com/xmlns/prod/dwa" version="1.0"> 
<message severity="informational" reason-code="AQT10000I">
<text>The operation was completed successfully.</text>
</message>
</dwa:messageOutput>
===================================================================

总结

通过上述介绍,我们对Informix数据仓库加速器的“数据集市部分更新”功能及基本使用方法有了一个比较深刻的了解。通过使用IWA,我们不仅可以极速加快大数据量数据集市的查询请求,同时,通过“数据集市部分更新”特性,我们可以实现数据增量加载功能,实现近实时数据查询、分析,为企业业务优化、辅助决策提供更好的帮助。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=840031
ArticleTitle=Informix 数据仓库加速器原理与实践,第 5 部分: 数据集市的部分更新
publish-date=11032011