Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1916749
  • 博文数量: 389
  • 博客积分: 7877
  • 博客等级: 少将
  • 技术积分: 4521
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-10 14:02
文章分类

全部博文(389)

文章存档

2024年(1)

2022年(1)

2021年(1)

2020年(1)

2019年(1)

2018年(3)

2017年(6)

2016年(4)

2015年(8)

2014年(15)

2013年(31)

2012年(19)

2011年(47)

2010年(33)

2009年(105)

2008年(109)

2007年(4)

分类:

2011-05-27 17:03:56

table db2inst1.multi_t_cust 的DDL:

CREATE TABLE "DB2INST1"."MULTI_T_CUST"  (
  "CUSTID" INTEGER NOT NULL ,
  "CUSTNAME" VARCHAR(20) NOT NULL ,
  "SEX" VARCHAR(4) NOT NULL ,
  "BIRTHDAY" DATE NOT NULL ,
  "EDUCATION" VARCHAR(20) NOT NULL ,
  "ADDRESS" VARCHAR(40) NOT NULL ,
  "PHONENO" INTEGER NOT NULL ,
  "FUND" DECIMAL(22,2) NOT NULL ,
  "COMMISION" DECIMAL(22,2) NOT NULL ,
  "REMARK" VARCHAR(200) NOT NULL )  
                  PARTITIONING KEY (CUSTID) USING HASHING            // 这里DB2 v9.7的标准推荐写法是 DISTRIBUTE BY(CUSTID) USING HASHING
IN "MULTITBS"
partition by range(CUSTID)
(PARTITION lower STARTING FROM (1) ENDING AT (500000),
PARTITION upper STARTING FROM (500001) ENDING AT (1100000)          //lower, upper 会在后面的操作中使用到
);

ALTER TABLE "DB2INST1"."MULTI_T_CUST"
ADD PRIMARY KEY
("CUSTID");


db2 "import from t_cust.del of del insert into db2inst1.multi_t_cust"
这里会插入100万行数据,

db2 "select dbpartitionnum(CUSTID),count(*) from db2inst1.multi_t_cust group by dbpartitionnum(CUSTID) order by dbpartitionnum(CUSTID)"
          0      250088
          1      250450
          2      249858
          3      249604

  4 record(s) selected.

数据分布较均匀,这里测试环境的DPF是4个数据节点


下面的特性是table partition (即TP) 提供,roll-in  和 roll-out  中文说滚入,滚出

db2 "alter table multi_t_cust detach partition lower into multi_t_cust_old"            //multi_t_cust_old这个表无需手动创建,执行这个命令后会生成这个表

这个操作很快就成功结束,再来看multi_t_cust表的数量:
db2 "select count(*) from multi_t_cust"
1          
-----------
     500000

  1 record(s) selected.


multi_t_cust_old表的数据量为是500000

db2 "select count(*) from multi_t_cust_old"

1          
-----------
     500000

  1 record(s) selected.


将滚出的50万数据再次滚入到multi_t_cust表:
db2 "alter table multi_t_cust attach partition lower starting (1) ending (500000) from table multi_t_cust_old"

上面的命令也会很快执行完毕,但是要想看到表里面的数据真正发生变化,还需要执行下面的命令:
db2 SET INTEGRITY for multi_t_cust immediate checked


现在的大小就是100万行:
db2 "select count(*) from multi_t_cust"

1          
-----------
    1000000

  1 record(s) selected.


简单总结:
DPF 将行均匀地分布在多个数据库分区上 可伸缩性 —— 随着数据库的增长增加计算资源(也就是数据库分区)
MDC 将在多个维上具有近似值的行放在表中相同的物理位置,即所谓的块 查询性能 —— 组织数据的方式有利于获得更快的检索速度,对于由多个谓词指定范围的查询尤其有效
TP 将所有行放在同一个数据分区的一个指定范围的维中 数据移动 —— 通过添加和删除整个数据分区,可以增加和删除大量数据

互补特性

本节详细阐述前面提出的观点,这 “三个朋友” 既是独立的,又是互补的。

当设计一个表时,对每个特性的使用可以认为是独立的。
是否使用 MDC 和 TP 对于决定 DPF 的分布键没有影响。
一个列是否被用作 MDC 维对于是否应该将它作为表分区键没有影响,反之亦然。每个决定都可以单独做出。
每个特性的工作方式,例如索引方面,不会随着新的分区特性的引入而改变。例如,当引入 MDC 时,它的索引方面不会改变 DPF 在索引方面的工作方式。同样,当引入 TP 时,也不会改变 DPF 或 MDC 在索引方面的行为。在学习这些特性的时候,记住这一点有助于避免陷入困惑。


表设计
数据仓库中的事实表(或历史表)非常适合使用上述每种特性;



对于 DPF,在选择一个分布键时,应首选那种能使数据行均匀地分布在多个数据库分区上的列。当不具备这样的条件时,就会造成数据倾斜。这意味着一个或一些数据 库分区承担了更重比例的表行,从而造成了性能瓶颈。具有很多不同值的列是较好的选择。还有一种考虑是选择能最大化联结性能的列。

另一个 DPF 设计决定是数据库分区的数量。数据库分区的数量不算是表设计方面的考虑。实际上,它是整个系统设计上的考虑,需要根据整个数据库预期的原始数据大小和服务 器硬件的能力来决定。很多系统需要的数据库分区不超过 20 个。但是,最大的系统可能需要更多的数据库分区。由于数据仓库有越来越大的趋势,数据库分区的数量有望增加。




对于 TP,设计决定包括选择用作表分区键的列和分区的数量。通常表分区键是基于时间的列。每个分区与每次转入的数据量相符。例如,每月转出数据的表,对于每个 月的数据都有一个分区。对于 TP,在设计时需要特别考虑的一点是,需要处理不在 CREATE table 语句中定义的值范围内的行。

对于需要每月根据 sale_date 转出数据的数据库,一种典型的设计是使用 sale_date 作为表分区键,并为每个月创建一个单独的分区。




分区特性设计决定 经验法则
DPF —— 用作分布键的列 首选是具有很多不同值的列
MDC —— 用作 MDC 维的列 一种典型的设计是选择一个表示日期的列,再加上 0 到 3 个其他列,例如 region 和 product_type
TP —— 用作表分区键的列和分区的数量 选择一个基于时间的列。定义与每次转出的数据量相符的分区



详细信息也可参考下面文章:
http://hi.baidu.com/mcj0127/blog/item/07fa7ddbeeb7916bd0164eed.html
阅读(2572) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~