2010-12-02 15:19:44 来源:CIO时代网
1、概述
对一个大问题进行划分处理是计算机领域常见的手段。在数据库应用中,对于一个大表,既可以选择进行水平分区,也可以选择进行垂直分区。水平分区在主流的数据库产品中都得到了实现,垂直分区一般要靠数据库设计人员自行实现(将一个表划分为多个表)。金仓数据库V6在数据库内核中实现了表的垂直分区,它可以简化数据库设计人员的工作,并为应用程序提供透明的SQL访问。
使用垂直分区主要利用了应用对表中字段访问的如下特性:
(1)字段访问频率的不均匀性:即某些字段访问特别频繁,其他字段则访问的较少。可以参考80/20原则。
(2)应用对字段访问的聚集性:即应用中的查询倾向于一起访问某些字段,如a、b、c三列总是一起访问;d、e两列总是一起访问。可以参考局部性原理。
(3)字段访问顺序的依赖性:即应用中的查询按照某个特定的顺序访问字段,例如访问d、e字段前总是先访问a、b、c字段。
在应用对表的访问满足以上特性之一时,使用垂直分区可以使访问/修改这些列的查询不再需要访问/修改其他无关列,从而减少物理I/O。
本文给出了一种根据“应用的访问模式”确定如何对表进行垂直分区(即确定分区表中字段)的思路,并且以一个应用为例。
2、金仓数据库V6中垂直分区实现方法
金仓数据库V6支持基于主码连接的垂直分区,语法如下:
CREATE TABLE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] [SchemaName.]TableName
(
{ ColumnName <DataType> [IDENTITY [(Seed, Increment)]]
[ DEFAULT { NULL | USER | <Expression> } ] [ <ColumnConstraint> ]
| [ <TableConstraint> ]
} [, ...n ]
) [ <VerticalPartitions> ]
[TABLESPACE TablespaceName]
<VerticalPartitions> ::= PARTITION BY COLUMN
( [PartitionName]
({ ColumnName [, ...n ])
[TABLESPACE TablespaceName] ) [, ...n ]
垂直分区是按列进行分区,即把一条记录分开多个地方保存,每个分区的行数相同,列顺序与PARTITION子句中的顺序。
包括存放没指定的列的分区,分区数目必须大于等于二,各分区表间允许字段重复,但不能完全重复。
垂直分区基表必须有主码字段,如果分区没有指定主码字段,将在分区中加入基表中的主码字段。
分区表不能有基表字段之外的字段,表中有但分区表没指定的字段默认放入一个新的分区表。
主码字段和重复字段不能指定为IDENTITY。
如果没有指定分区名,系统会自动建立分区名,分区的命名规则为基表名_VP_[1…N]。分区和基表在同一命名空间。
如果没有指定表空间,缺省存放到分区基表所在的表空间中。
不支持建立跨分区的表级约束。
例子:
CREATE TABLE base (
col1 INT, col2 INT, col3 INT, col4 INT, col5 CHAR(100),
PRIMARY KEY(col1, col2)
)
PARTITION BY COLUMN (P1(col1, col2, col3, col4), P2(col5));
将会创建名为BASE的基表和P1、P2两个分区表。P1和P2的结构如图所示,两个分区都包含元组控制信息(元组头)、各分区的分区列和作为连接索引的主码列col1和col2。