当前位置:文档之家› DB2分区表

DB2分区表

DB2 V9.7 for Linux, UNIX, and Windows表分区表分区功能是一种数据组织方案,即,表数据根据一个或多个表列中的值分布到多个存储对象(称为数据分区或范围)中。

每个数据分区都是单独存储的。

这些存储对象可以在不同的表空间中,也可以在相同表空间中。

存储对象的行为与单个表的行为非常类似,它通过使用ALTER TABLE ... ATTACH 语句将现有表合并到分区表中,可以很容易实现快速转入。

同样,使用ALTER TABLE ... DETACH 语句很容易实现转出。

查询处理同样可以利用分离的数据来避免扫描不相关数据,从而使许多数据仓库样式查询具有更好地查询性能。

按照CREATE TABLE 语句的PARTITION BY 子句中指定那样将表数据分区。

此定义中使用的列被称为表分区键列。

这种组织方案可以单独地使用,也可与其他组织方案结合使用。

通过组合使用CREATE TABLE 语句的DISTRIBUTE BY 和PARTITION BY 子句,可以将数据分布到跨多个表空间的数据库分区。

该组织方案包括:∙DISTRIBUTE BY HASH∙PARTITION BY RANGE∙ORGANIZE BY DIMENSIONS表分区功能可用于DB2® 企业服务器版Linux 版、UNIX 版和Windows 版版本9.1 和更高版本。

表分区的优点如果下列任何情况适用于您和您的组织,请考虑表分区的许多优点:∙更容易转入和转出表数据使数据仓库受益∙数据仓库包括大型表∙您正在考虑从先前发行版或某个竞争数据库产品迁移至版本9.1 数据库∙想要更有效地使用分层存储管理(HSM) 解决方案表分区简化了表数据转入和转出以及管理工作,并且提高了索引位置的灵活性和查询处理效率。

有效转入和转出表分区功能提高了表数据的转入和转出效率。

这可通过使用ALTER TABLE 语句的ATTACH PARTITION 和DETACH PARTITION 子句来实现。

通过转入分区表数据,可以方便地将新范围作为附加数据分区合并到分区表中。

通过转出分区表数据,可以方便地从分区表中分离出某些范围的数据,以进行后续清除或归档处理。

更容易管理大型表由于您可以在各个数据分区上执行管理任务,因此表级别管理更灵活。

这些任务包括:拆离和重新连接数据分区、备份和复原各个数据分区以及重组各个索引。

通过将花费较长时间的维护操作分解成一系列较小的操作,可以缩短这种维护操作的执行时间。

例如,将数据分区放置在单独的表空间中后,备份操作可以逐个处理数据分区。

因此,可以一次备份分区表的一个数据分区。

灵活的索引位置现在,可以将索引放置在不同的表空间中,从而允许对索引位置进行更精细地控制。

这种新设计具有以下一些好处:∙提高了删除索引和联机索引创建的性能∙能够针对每个表索引之间的任何表空间特征使用不同的值(例如,为了确保更好的空间利用率,对每个索引使用不同的页大小可能更合适)。

∙减少IO 争用并提供对表索引数据更有效的并发访问。

∙删除各个索引时,空间将立即可供系统使用,而无需进行索引重组。

∙如果您选择执行索引重组,可以重组单个索引。

DMS 和SMS 表空间都支持在不同于表的另一个位置使用索引。

提高了商业智能样式查询的性能增强了查询处理功能,能够根据查询谓词自动消除某些数据分区。

此功能称为数据分区消除,可为许多决策支持查询带来好处。

下列示例创建了一个名为CUSTOMER 的表,其中包含l_shipdate >= '01/01/2006'和l_shipdate <= '03/31/2006' 的行存储在表空间TS1 中,包含l_shipdate >='04/01/2006' 和l_shipdate <= '06/30/2006' 的行存储在表空间TS2 中,等等。

CREATE TABLE customer (l_shipdate DATE, l_name CHAR(30))IN ts1, ts2, ts3, ts4, ts5PARTITION BY RANGE(l_shipdate) (STARTING FROM ('01/01/2006')ENDING AT ('12/31/2006') EVERY (3 MONTHS))DB2 和Informix 数据库中的数据组织方案表分区功能是一种数据组织方案,即,表数据根据一个或多个表列中的值分布到多个存储对象(称为数据分区或范围)中。

每个数据分区都是单独存储的。

这些存储对象可以在不同的表空间中,也可以在相同表空间中。

按照CREATE TABLE 语句的PARTITION BY 子句中指定那样将表数据分区。

此定义中使用的列被称为表分区键列。

DB2® 表分区功能与Informix® Dynamic Server 和Informix Extended Parallel Server 提供的数据分段组织方法相对应。

Informix 方法Informix 支持若干种数据组织方案,在Informix 产品中,这些方案称为分段。

其中一种较常使用的分段类型是FRAGMENT BY EXPRESSION。

这种类型的分段的工作方式与CASE 语句非常相似,其中有一个与表的每个分段相关联的表达式。

检查这些表达式以便确定行的放置位置。

Informix 与DB2 数据库系统的比较DB2 数据库提供了丰富的补充功能,这些功能与Informix 数据组织方案直接对应,这使客户能够相对容易地从Informix 语法转换为 DB2 语法。

DB2 数据库管理器将生成列与CREATETABLE 语句的PARTITION BY RANGE 子句配合使用,以处理复杂的Informix 方案。

表1对Informix 和 DB2 数据库产品中使用的数据组织方案作了比较。

示例下列示例详细说明了在 DB2 数据库中如何实现与任何使用表达式的Informix 分段方案等同的结果。

示例1:下面这个基本的Create Table 语句显示了Informix 分段以及等同的 DB2 数据库系统表分区语法:Informix 语法:CREATE TABLE demo(a INT) FRAGMENT BY EXPRESSIONa = 1 IN db1,a = 2 IN db2,a = 3 IN db3;DB2 语法:CREATE TABLE demo(a INT) PARTITION BY RANGE(a)(STARTING(1) IN db1,STARTING(2) IN db2,STARTING(3) ENDING(3) IN db3);Informix XPS 支持称为hybrid 的两层分段方案,在此方案中,使用一个表达式来在协作服务器之间分布数据,并使用第二个表达式来在协作服务器内分布数据。

这使所有协作服务器都能够参与查询(即,在所有协作服务器上都有数据),并使查询能够利用数据分区消除功能的优势。

通过结合使用CREATE TABLE 语句的DISTRIBUTE BY 和PARTITION BY 子句,DB2 数据库系统实现了与Informix hybrid 等同的组织方案。

示例2:以下示例显示了组合子句的语法:Informix 语法CREATE TABLE demo(a INT, b INT) FRAGMENT BY HYBRID HASH(a)EXPRESSION b = 1 IN dbsl1,b = 2 IN dbsl2;DB2 语法CREATE TABLE demo(a INT, b INT) IN dbsl1, dbsl2DISTRIBUTE BY HASH(a),PARTITION BY RANGE(b) (STARTING 1 ENDING 2 EVERY 1);此外,可以使用多维集群来进一步组织数据:CREATE TABLE demo(a INT, b INT, c INT) IN dbsl1, dbsl2DISTRIBUTE BY HASH(a),PARTITION BY RANGE(b) (STARTING 1 ENDING 2 EVERY 1)ORGANIZE BY DIMENSIONS(c);这样,列a值相同的所有行都在同一个数据库分区中。

所有列b值相同的行都在同一个表空间中。

对于具有给定的a和b值的行,会将再具有相同c值的所有行集中到一个磁盘上。

此方法非常适合于OLAP 类型的下寻操作,这是因为,仅需扫描单个数据库分区上单个表空间中的一个或数个扩展数据块就可以满足此类查询。

应用表分区以解决常见的应用程序问题下列各节讨论如何应用各种 DB2 表分区功能以解决常见的应用程序问题。

每一节都特别侧重于采取最佳措施来将各种Informix 分段方案映射到等同的 DB2 表分区方案。

创建简单数据分区范围时的注意事项其中一种最常见的表分区应用是根据日期键对大型事实表进行分区。

如果需要创建大小统一的日期范围,请考虑使用自动生成的CREATE TABLE 语法格式。

示例示例1:以下示例显示自动生成的语法格式:CREATE TABLE orders(l_orderkey DECIMAL(10,0) NOT NULL,l_partkey INTEGER,l_suppkey INTEGER,l_linenumber INTEGER,l_quantity DECIMAL(12,2),l_extendedprice DECIMAL(12,2),l_discount DECIMAL(12,2),l_tax DECIMAL(12,2),l_returnflag CHAR(1),l_linestatus CHAR(1),l_shipdate DATE,l_commitdate DATE,l_receiptdate DATE,l_shipinstruct CHAR(25),l_shipmode CHAR(10),l_comment VARCHAR(44))PARTITION BY RANGE(l_shipdate)(STARTING '1/1/1992' ENDING '12/31/1993' EVERY 1 MONTH);这将创建24 个范围,即对1992-1993 的每个月创建一个范围。

尝试插入l_shipdate 超出该范围的行将导致错误。

示例2:将上一示例与以下Informix 语法作比较:create table orders(l_orderkey decimal(10,0) not null,l_partkey integer,l_suppkey integer,l_linenumber integer,l_quantity decimal(12,2),l_extendedprice decimal(12,2),l_discount decimal(12,2),l_tax decimal(12,2),l_returnflag char(1),l_linestatus char(1),l_shipdate date,l_commitdate date,l_receiptdate date,l_shipinstruct char(25),l_shipmode char(10),l_comment varchar(44)) fragment by expressionl_shipdate < '1992-02-01' in ldbs1,l_shipdate >= '1992-02-01' and l_shipdate < '1992-03-01' in ldbs2,l_shipdate >= '1992-03-01' and l_shipdate < '1992-04-01' in ldbs3,l_shipdate >= '1992-04-01' and l_shipdate < '1992-05-01' in ldbs4,l_shipdate >= '1992-05-01' and l_shipdate < '1992-06-01' in ldbs5,l_shipdate >= '1992-06-01' and l_shipdate < '1992-07-01' in ldbs6,l_shipdate >= '1992-07-01' and l_shipdate < '1992-08-01' in ldbs7,l_shipdate >= '1992-08-01' and l_shipdate < '1992-09-01' in ldbs8,l_shipdate >= '1992-09-01' and l_shipdate < '1992-10-01' in ldbs9, l_shipdate >= '1992-10-01' and l_shipdate < '1992-11-01' in ldbs10, l_shipdate >= '1992-11-01' and l_shipdate < '1992-12-01' in ldbs11, l_shipdate >= '1992-12-01' and l_shipdate < '1993-01-01' in ldbs12, l_shipdate >= '1993-01-01' and l_shipdate < '1993-02-01' in ldbs13, l_shipdate >= '1993-02-01' and l_shipdate < '1993-03-01' in ldbs14, l_shipdate >= '1993-03-01' and l_shipdate < '1993-04-01' in ldbs15, l_shipdate >= '1993-04-01' and l_shipdate < '1993-05-01' in ldbs16, l_shipdate >= '1993-05-01' and l_shipdate < '1993-06-01' in ldbs17, l_shipdate >= '1993-06-01' and l_shipdate < '1993-07-01' in ldbs18, l_shipdate >= '1993-07-01' and l_shipdate < '1993-08-01' in ldbs19, l_shipdate >= '1993-08-01' and l_shipdate < '1993-09-01' in ldbs20, l_shipdate >= '1993-09-01' and l_shipdate < '1993-10-01' in ldbs21, l_shipdate >= '1993-10-01' and l_shipdate < '1993-11-01' in ldbs22, l_shipdate >= '1993-11-01' and l_shipdate < '1993-12-01' in ldbs23, l_shipdate >= '1993-12-01' and l_shipdate < '1994-01-01' in ldbs24, l_shipdate >= '1994-01-01' in ldbs25;注意,Informix 语法提供了上下不封顶的范围以捕获预期范围外的日期。

相关主题