3000sunqin 和hujingyu 两位大虾,请教一个概念。分区键的功能就是用来指示相应的数据在哪个数据库分区上的,也就是说是数据库分布在不同的节点上,通过节点组分布表空间,在上面进行数据分布。
1、在节点组这一层,没有问题
2、分布表空间指定了每个节点的容器,数据以hash的方式分布于容器中
3、建表的时候指定了表空间,则表数据以hash的方式分布于表空间容器中
4、建表的时候指定PARTITIONING KEY (MIX_INT) USING HASHING,数据不能够分布在不同的表空间吧。
5、对于表空间,分布在不同的节点上,你能指定表数据存储在哪个节点的容器上,我认为不可以。
6、之所以作分区,是为了提高性能,但是如果按照这种方法,应该还是要操作整个表,而不是一个表的分区
我们可以看一个oracle数据库的分区例子,
CREATE TABLE FO_GINCALL
(
DAY_ID NUMBER(8),
HOUR_ID NUMBER(2),
CALLKND_ID NUMBER(4) NOT NULL,
CITYCODE_ID NUMBER(4),
FEEKND_ID NUMBER(16),
CALLTIME VARCHAR2(14 BYTE) NOT NULL,
SVC_ID VARCHAR2(20 BYTE) NOT NULL,
OPPOSENUMBER VARCHAR2(20 BYTE) NOT NULL,
BALANCE NUMBER(12,2),
CALLDURATION NUMBER(12),
CALLFEE NUMBER(12,2),
FEATUREFLAG NUMBER(1),
BEARERFLAG NUMBER(1),
FORWARDINGFLAG NUMBER(1),
ISFIRSTCALL NUMBER(1),
TIMESTAMP DATE,
SUBPARTNO NUMBER(2) NOT NULL
)
TABLESPACE TBS_ODS
PCTUSED 0
PCTFREE 10
INITRANS 1
MAXTRANS 60
STORAGE (
INITIAL 300M
MINEXTENTS 1
MAXEXTENTS 255
PCTINCREASE 0
)
NOLOGGING
PARTITION BY RANGE (SUBPARTNO)
(
PARTITION P_GINCALL_01 VALUES LESS THAN (2)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN01
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_02 VALUES LESS THAN (3)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN02
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_03 VALUES LESS THAN (4)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN03
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_04 VALUES LESS THAN (5)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN04
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_05 VALUES LESS THAN (6)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN05
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_06 VALUES LESS THAN (7)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN06
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_07 VALUES LESS THAN (8)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN07
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_08 VALUES LESS THAN (9)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN08
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_09 VALUES LESS THAN (10)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN09
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_10 VALUES LESS THAN (11)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN10
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_11 VALUES LESS THAN (12)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN11
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_12 VALUES LESS THAN (13)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN12
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_13 VALUES LESS THAN (14)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN13
PCTFREE 10
INITRANS 1
MAXTRANS 60
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_14 VALUES LESS THAN (15)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN14
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_15 VALUES LESS THAN (16)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN15
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_16 VALUES LESS THAN (17)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN16
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_17 VALUES LESS THAN (18)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN17
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_18 VALUES LESS THAN (19)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN18
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_19 VALUES LESS THAN (20)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN19
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_20 VALUES LESS THAN (21)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN20
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_21 VALUES LESS THAN (22)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN21
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_22 VALUES LESS THAN (23)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN22
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_23 VALUES LESS THAN (24)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN23
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_24 VALUES LESS THAN (25)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN24
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_25 VALUES LESS THAN (26)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN25
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_26 VALUES LESS THAN (27)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN27
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_27 VALUES LESS THAN (28)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN27
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_28 VALUES LESS THAN (29)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN28
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_29 VALUES LESS THAN (30)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN29
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_30 VALUES LESS THAN (31)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN30
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
),
PARTITION P_GINCALL_31 VALUES LESS THAN (MAXVALUE)
NOLOGGING
NOCOMPRESS
TABLESPACE TBS_IN31
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 50M
MINEXTENTS 1
MAXEXTENTS 2147483645
BUFFER_POOL DEFAULT
)
)
NOCACHE
PARALLEL ( DEGREE DEFAULT INSTANCES 1 );
如果我用了这样一个SQL,可以保证他只会访问分区 P_GINCALL_30 (及只对TABLESPACE TBS_IN30操作,极大的提高了性能)
SELECT DAY_ID
FROM FO_GINCALL
WHERE SUBPARTNO=30
如果按照DB2表可以分区(和oracle表分区一样,而不是按照索引、常规数据、大对象的不同表空间分布),那么也就是说上面oracle的表分区方法在DB2里面可以实现了(当然不是通过union all的视图,union all的视图可以做到这一点),请大虾指点实现方法
还有,分区数据库,就是将数据库实例分布于不同节点的数据库吧。
还有,是不是我们对表分区的概念有不同的理解。
不对之处请大家多多指点,大家共同学习,共同进步。
3000sunqin 回复于:2003-09-16 13:37:44
1.在定义好的节点组上创建表空间;
2.在DB2的表空间中的表的数据不能指定存放在节点组的特定节点上。它是根据分区键的HASH算法来分布到各个组上的。
3.DB2 SQL的执行方式是,当一个SQL请求来了之后,DB2分析SQL请求的分区键条件是位于那些分区上的,然后将该SQL请求拆分成多个SQL发送到各自的节点上去。而在每个节点上执行SQL请求的时候使用的是节点自身存储的索引,对一个SQL查询来说索引的搜索效率与性能是最有关系的,在每个节点的索引只包括了本节点包含的表数据的索引,因此其索引量比未分区前要少的多。在各个子SQL执行完毕后,DB2将结果集拼装起来返回给用户。
4.可以看到在DB2中分区键的存放方式是以HASH算法来分布的,一般来说建议使用高基数的字段(拥有多个不同值)来作为分区键,这样可以使数据被平均分布,容易利用节点组中所有的节点资源来执行查询操作。
5.至于要达到你说的目的,在查询的时候只去访问一个节点来进行查询,当然也是可以的。我们来看一个例子:如果一个节点组上拥有10个节点,而作为分区键的字段MIXINT只有5个不同值的话,那么根据HASH算法,只有五个节点上会被分布到数据,这样可以得出一个结论,当节点组中节点的数目大于或等于分区键中的不同值的数目的时候,在各个节点上不会出现不同的分区键,即每个节点上至多只有一个分区键的数据。但是这样的数据分布对查询的性能的帮助并不是最大,应该说有一个好处就是便于进行数据的维护。那么你可以指定多个字段做为分区键,一个高基数,一个低基数,这样既能够达到数据的分布的合理化,又能够使性能提升。
6.你想要达到的目的,可能是由于使用Oracle的时候的理解,在DB2中,使用将一个SQL分发到多个节点上进行查询以提高效率,而不是去限制查询数据的范围来提高性能。应该说这是达到性能提高的两个方面,个人认为分区中平均分配数据的方式比在分区中存储单键值的分区方式在对抗数据分布情况比较恶劣的情况下要好,例如假如数据数目对于你的分区键值按照正态分布的时候,指定多个分区键来平均分配数据将获得一个平稳的性能。
一点拙见,见笑了
windrain 回复于:2003-09-16 14:02:53
总结一下我们的观点
1、对于分区,oracle可以明确的指定表空间,通过表空间来实现,DB2是通过节点实现的,并不是表空间一级的,用户并不明确知道存储在哪个节点。(我记得DB2的数据是平均分布的,可能由于我没有使用分区键)
2、针对SMP和MPP的处理过程,DB2和Oracle的处理方式不同,不过就并行处理,DB2更好一些。
3、大数据量处理的时候DB2比Oracle的性能更好一些(这是我个人的观点,我比较了一个5亿条数据的表在Oracle和DB2的性能)。
谢谢3000sunqin 的指点,又进步不少
希望论坛的讨论交流气氛更活跃一些
richardluopeng 回复于:2003-09-17 11:38:08
好,学习,谢谢好东西!
|