表分区
表分区是一种数据组织方案,在此方案中,表数据根据一个或多个表列中的值划分到多个称为数据分区的存储对象中。每个数据分区都是单独存储的。这些存储对象可以在不同的表空间中,也可以在相同表空间中。
存储对象的行为与单个表的行为非常类似,它通过使用 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® V9.1 Enterprise Server Edition for Linux, UNIX, and Windows 和更高版本。
表分区的优点
如果下列任何情况适用于您和您的组织,请考虑表分区的许多优点:
- 数据仓库因为更容易转入和转出表数据而受益。
- 数据仓库包括大型表。
- 您将考虑从先前发行版或某个具竞争力的数据库产品迁移至 V9.1 数据库
- 您想要更有效地使用分层存储管理 (HSM) 解决方案。
表分区简化了表数据转入和转出以及管理工作,并且提高了索引位置的灵活性和查询处理效率。
- 有效转入和转出
- 表分区功能提高了表数据的转入和转出效率。可通过使用 ALTER TABLE 语句的 ATTACH PARTITION 和 DETACH PARTITION 子句来实现此效率。通过转入分区表数据,可以方便地将新范围作为附加数据分区合并到分区表中。通过转出分区表数据,可轻松地从分区表中分离出某些范围的数据,以进行后续清除或归档处理。
借助 DB2 V9.7 FP1 和更高发行版,在使用带 DETACH PARTITION 子句的 ALTER TABLE 语句从分区表拆离数据分区时,源分区表仍然可供在 RS、CS 或 UR 隔离级别下运行的动态查询访问。同样,在使用带 ATTACH PARTITION 子句的 ALTER TABLE 语句将数据分区连接至分区表时,目标分区表仍然可供在 RS、CS 或 UR 隔离级别下运行的动态查询访问。
- 更容易管理大型表
- 由于您可以在各个数据分区上执行管理任务,因此表级别管理更灵活。这些任务包括:拆离和重新连接数据分区、备份和复原各个数据分区以及重组各个索引。通过将花费较长时间的维护操作分解成一系列较小的操作,可以缩短这种维护操作的执行时间。例如,将数据分区放置在单独的表空间中后,备份操作可以逐个处理数据分区。因此,可以一次备份分区表的一个数据分区。
- 灵活的索引位置
- 现在,可以将索引放置在不同的表空间中,从而允许对索引位置进行更精细地控制。此设计具有以下一些好处:
- 删除索引和创建联机索引时改进性能。
- 能够针对每个表索引之间的任何表空间特征使用不同的值(例如,为了确保更好的空间利用率,对每个索引使用不同的页大小可能更合适)。
- 减少 I/O 争用,这有助于更高效地对表索引数据进行并行访问。
- 删除各个索引时,空间立即对系统可用,不需要索引重组。
- 如果您选择执行索引重组,可以重组单个索引。
- 提高了商业智能样式查询的性能
- 增强了查询处理功能,能够根据查询谓词自动消除某些数据分区。此查询处理称为数据分区消除,可为许多决策支持查询带来好处。
下列示例创建了一个名为 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, ts5
PARTITION BY RANGE(l_shipdate) (STARTING FROM ('01/01/2006')
ENDING AT ('12/31/2006') EVERY (3 MONTHS))
