DB2分区表.docx
- 文档编号:17963766
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:60
- 大小:119.53KB
DB2分区表.docx
《DB2分区表.docx》由会员分享,可在线阅读,更多相关《DB2分区表.docx(60页珍藏版)》请在冰豆网上搜索。
DB2分区表
DB2V9.7forLinux,UNIX,andWindows
表分区
表分区功能是一种数据组织方案,即,表数据根据一个或多个表列中的值分布到多个存储对象(称为数据分区或范围)中。
每个数据分区都是单独存储的。
这些存储对象可以在不同的表空间中,也可以在相同表空间中。
存储对象的行为与单个表的行为非常类似,它通过使用ALTERTABLE...ATTACH语句将现有表合并到分区表中,可以很容易实现快速转入。
同样,使用ALTERTABLE...DETACH语句很容易实现转出。
查询处理同样可以利用分离的数据来避免扫描不相关数据,从而使许多数据仓库样式查询具有更好地查询性能。
按照CREATETABLE语句的PARTITIONBY子句中指定那样将表数据分区。
此定义中使用的列被称为表分区键列。
这种组织方案可以单独地使用,也可与其他组织方案结合使用。
通过组合使用CREATETABLE语句的DISTRIBUTEBY和PARTITIONBY子句,可以将数据分布到跨多个表空间的数据库分区。
该组织方案包括:
∙DISTRIBUTEBYHASH
∙PARTITIONBYRANGE
∙ORGANIZEBYDIMENSIONS
表分区功能可用于DB2®企业服务器版Linux版、UNIX版和Windows版版本9.1和更高版本。
表分区的优点
如果下列任何情况适用于您和您的组织,请考虑表分区的许多优点:
∙更容易转入和转出表数据使数据仓库受益
∙数据仓库包括大型表
∙您正在考虑从先前发行版或某个竞争数据库产品迁移至版本9.1数据库
∙想要更有效地使用分层存储管理(HSM)解决方案
表分区简化了表数据转入和转出以及管理工作,并且提高了索引位置的灵活性和查询处理效率。
有效转入和转出
表分区功能提高了表数据的转入和转出效率。
这可通过使用ALTERTABLE语句的ATTACHPARTITION和DETACHPARTITION子句来实现。
通过转入分区表数据,可以方便地将新范围作为附加数据分区合并到分区表中。
通过转出分区表数据,可以方便地从分区表中分离出某些范围的数据,以进行后续清除或归档处理。
更容易管理大型表
由于您可以在各个数据分区上执行管理任务,因此表级别管理更灵活。
这些任务包括:
拆离和重新连接数据分区、备份和复原各个数据分区以及重组各个索引。
通过将花费较长时间的维护操作分解成一系列较小的操作,可以缩短这种维护操作的执行时间。
例如,将数据分区放置在单独的表空间中后,备份操作可以逐个处理数据分区。
因此,可以一次备份分区表的一个数据分区。
灵活的索引位置
现在,可以将索引放置在不同的表空间中,从而允许对索引位置进行更精细地控制。
这种新设计具有以下一些好处:
∙提高了删除索引和联机索引创建的性能
∙能够针对每个表索引之间的任何表空间特征使用不同的值(例如,为了确保更好的空间利用率,对每个索引使用不同的页大小可能更合适)。
∙减少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中,等等。
CREATETABLEcustomer(l_shipdateDATE,l_nameCHAR(30))
INts1,ts2,ts3,ts4,ts5
PARTITIONBYRANGE(l_shipdate)(STARTINGFROM('01/01/2006')
ENDINGAT('12/31/2006')EVERY(3MONTHS))
DB2和Informix数据库中的数据组织方案
表分区功能是一种数据组织方案,即,表数据根据一个或多个表列中的值分布到多个存储对象(称为数据分区或范围)中。
每个数据分区都是单独存储的。
这些存储对象可以在不同的表空间中,也可以在相同表空间中。
按照CREATETABLE语句的PARTITIONBY子句中指定那样将表数据分区。
此定义中使用的列被称为表分区键列。
DB2®表分区功能与Informix®DynamicServer和InformixExtendedParallelServer提供的数据分段组织方法相对应。
Informix方法
Informix支持若干种数据组织方案,在Informix产品中,这些方案称为分段。
其中一种较常使用的分段类型是FRAGMENTBYEXPRESSION。
这种类型的分段的工作方式与CASE语句非常相似,其中有一个与表的每个分段相关联的表达式。
检查这些表达式以便确定行的放置位置。
Informix与DB2数据库系统的比较
DB2 数据库提供了丰富的补充功能,这些功能与Informix数据组织方案直接对应,这使客户能够相对容易地从Informix语法转换为 DB2 语法。
DB2 数据库管理器将生成列与CREATETABLE语句的PARTITIONBYRANGE子句配合使用,以处理复杂的Informix方案。
表1 对Informix和 DB2 数据库产品中使用的数据组织方案作了比较。
表1.所有Informix与 DB2 数据组织方案的映射
数据组织方案
Informix语法
DB2 V9.1语法
∙Informix:
基于表达式
∙DB2:
表分区
FRAGMENTBYEXPRESSION
PARTITIONBYRANGE
∙Informix:
循环法
∙DB2:
缺省
FRAGMENTBYROUNDROBIN
没有语法:
DB2 数据库管理器自动在容器之间分发数据
∙Informix:
范围分布
∙DB2:
表分区
FRAGMENTBYRANGE
PARTITIONBYRANGE
∙Informix:
系统定义的散列
∙DB2:
数据库分区
FRAGMENTBYHASH
DISTRIBUTEBYHASH
∙Informix:
HYBRID
∙DB2:
在进行表分区的情况下进行数据库分区
FRAGMENTBYHYBRID
DISTRIBUTEBYHASH和PARTITIONBYRANGE
∙Informix:
不适用
∙DB2:
多维集群
不适用
ORGANIZEBYDIMENSION
示例
下列示例详细说明了在 DB2 数据库中如何实现与任何使用表达式的Informix分段方案等同的结果。
示例1:
下面这个基本的CreateTable语句显示了Informix分段以及等同的 DB2 数据库系统表分区语法:
Informix语法:
CREATETABLEdemo(aINT)FRAGMENTBYEXPRESSION
a=1INdb1,
a=2INdb2,
a=3INdb3;
DB2 语法:
CREATETABLEdemo(aINT)PARTITIONBYRANGE(a)
(STARTING
(1)INdb1,
STARTING
(2)INdb2,
STARTING(3)ENDING(3)INdb3);
InformixXPS支持称为hybrid的两层分段方案,在此方案中,使用一个表达式来在协作服务器之间分布数据,并使用第二个表达式来在协作服务器内分布数据。
这使所有协作服务器都能够参与查询(即,在所有协作服务器上都有数据),并使查询能够利用数据分区消除功能的优势。
通过结合使用CREATETABLE语句的DISTRIBUTEBY和PARTITIONBY子句,DB2 数据库系统实现了与Informixhybrid等同的组织方案。
示例2:
以下示例显示了组合子句的语法:
Informix语法
CREATETABLEdemo(aINT,bINT)FRAGMENTBYHYBRIDHASH(a)
EXPRESSIONb=1INdbsl1,
b=2INdbsl2;
DB2 语法
CREATETABLEdemo(aINT,bINT)INdbsl1,dbsl2
DISTRIBUTEBYHASH(a),
PARTITIONBYRANGE(b)(STARTING1ENDING2EVERY1);
此外,可以使用多维集群来进一步组织数据:
CREATETABLEdemo(aINT,bINT,cINT)INdbsl1,dbsl2
DISTRIBUTEBYHASH(a),
PARTITIONBYRANGE(b)(STARTING1ENDING2EVERY1)
ORGANIZEBYDIMENSIONS(c);
这样,列 a 值相同的所有行都在同一个数据库分区中。
所有列 b 值相同的行都在同一个表空间中。
对于具有给定的 a 和 b 值的行,会将再具有相同 c 值的所有行集中到一个磁盘上。
此方法非常适合于OLAP类型的下寻操作,这是因为,仅需扫描单个数据库分区上单个表空间中的一个或数个扩展数据块就可以满足此类查询。
应用表分区以解决常见的应用程序问题
下列各节讨论如何应用各种 DB2 表分区功能以解决常见的应用程序问题。
每一节都特别侧重于采取最佳措施来将各种Informix分段方案映射到等同的 DB2 表分区方案。
创建简单数据分区范围时的注意事项
其中一种最常见的表分区应用是根据日期键对大型事实表进行分区。
如果需要创建大小统一的日期范围,请考虑使用自动生成的CREATETABLE语法格式。
示例
示例1:
以下示例显示自动生成的语法格式:
CREATETABLEorders
(
l_orderkeyDECIMAL(10,0)NOTNULL,
l_partkeyINTEGER,
l_suppkeyINTEGER,
l_linenumberINTEGER,
l_quantityDECIMAL(12,2),
l_extendedpriceDECIMAL(12,2),
l_discountDECIMAL(12,2),
l_taxDECIMAL(12,2),
l_returnflagCHAR
(1),
l_linestatusCHAR
(1),
l_shipdateDATE,
l_commitdateDATE,
l_receiptdateDATE,
l_shipinstructCHAR(25),
l_shipmodeCHAR(10),
l_commentVARCHAR(44))
PARTITIONBYRANGE(l_shipdate)
(STARTING'1/1/1992'ENDING'12/31/1993'EVERY1MONTH);
这将创建24个范围,即对1992-1993的每个月创建一个范围。
尝试插入l_shipdate超出该范围的行将导致错误。
示例2:
将上一示例与以下Informix语法作比较:
createtableorders
(
l_orderkeydecimal(10,0)notnull,
l_partkeyinteger,
l_suppkeyinteger,
l_linenumberinteger,
l_quantitydecimal(12,2),
l_extendedpricedecimal(12,2),
l_discountdecimal(12,2),
l_taxdecimal(12,2),
l_returnflagchar
(1),
l_linestatuschar
(1),
l_shipdatedate,
l_commitdatedate,
l_receiptdatedate,
l_shipinstructchar(25),
l_shipmodechar(10),
l_commentvarchar(44)
)fragmentbyexpression
l_shipdate<'1992-02-01'inldbs1,
l_shipdate>='1992-02-01'andl_shipdate<'1992-03-01'inldbs2,
l_shipdate>='1992-03-01'andl_shipdate<'1992-04-01'inldbs3,
l_shipdate>='1992-04-01'andl_shipdate<'1992-05-01'inldbs4,
l_shipdate>='1992-05-01'andl_shipdate<'1992-06-01'inldbs5,
l_shipdate>='1992-06-01'andl_shipdate<'1992-07-01'inldbs6,
l_shipdate>='1992-07-01'andl_shipdate<'1992-08-01'inldbs7,
l_shipdate>='1992-08-01'andl_shipdate<'1992-09-01'inldbs8,
l_shipdate>='1992-09-01'andl_shipdate<'1992-10-01'inldbs9,
l_shipdate>='1992-10-01'andl_shipdate<'1992-11-01'inldbs10,
l_shipdate>='1992-11-01'andl_shipdate<'1992-12-01'inldbs11,
l_shipdate>='1992-12-01'andl_shipdate<'1993-01-01'inldbs12,
l_shipdate>='1993-01-01'andl_shipdate<'1993-02-01'inldbs13,
l_shipdate>='1993-02-01'andl_shipdate<'1993-03-01'inldbs14,
l_shipdate>='1993-03-01'andl_shipdate<'1993-04-01'inldbs15,
l_shipdate>='1993-04-01'andl_shipdate<'1993-05-01'inldbs16,
l_shipdate>='1993-05-01'andl_shipdate<'1993-06-01'inldbs17,
l_shipdate>='1993-06-01'andl_shipdate<'1993-07-01'inldbs18,
l_shipdate>='1993-07-01'andl_shipdate<'1993-08-01'inldbs19,
l_shipdate>='1993-08-01'andl_shipdate<'1993-09-01'inldbs20,
l_shipdate>='1993-09-01'andl_shipdate<'1993-10-01'inldbs21,
l_shipdate>='1993-10-01'andl_shipdate<'1993-11-01'inldbs22,
l_shipdate>='1993-11-01'andl_shipdate<'1993-12-01'inldbs23,
l_shipdate>='1993-12-01'andl_shipdate<'1994-01-01'inldbs24,
l_shipdate>='1994-01-01'inldbs25;
注意,Informix语法提供了上下不封顶的范围以捕获预期范围外的日期。
通过添加使用MINVALUE和MAXVALUE的范围,可以将 DB2 语法修改为与Informix语法匹配。
示例3:
以下示例将示例1修改为与Informix语法匹配:
CREATETABLEorders
(
l_orderkeyDECIMAL(10,0)NOTNULL,
l_partkeyINTEGER,
l_suppkeyINTEGER,
l_linenumberINTEGER,
l_quantityDECIMAL(12,2),
l_extendedpriceDECIMAL(12,2),
l_discountDECIMAL(12,2),
l_taxDECIMAL(12,2),
l_returnflagCHAR
(1),
l_linestatusCHAR
(1),
l_shipdateDATE,
l_commitdateDATE,
l_receiptdateDATE,
l_shipinstructCHAR(25),
l_shipmodeCHAR(10),
l_commentVARCHAR(44)
)PARTITIONBYRANGE(l_shipdate)
(STARTINGMINVALUE,
STARTING'1/1/1992'ENDING'12/31/1993'EVERY1MONTH,
ENDINGMAXVALUE);
这种技术允许将任何日期插入到表中。
使用生成列按表达式进行分区
虽然 DB2 数据库并不直接支持按表达式进行分区,但支持按生成列进行分区,因此有可能获得相同的结果。
在决定是否使用此方法前,请考虑下列用法准则:
∙生成列是真实的列,它占用物理磁盘空间。
使用生成列的表会略微变大。
∙对于在分区表进行分区时所基于的列,不能改变其生成列表达式。
尝试执行此操作将产生消息SQL0190。
如果按下一节描述的方式将新数据分区添加到使用生成列的表中,通常要求改变定义生成列的表达式。
目前,不支持改变定义生成列的表达式。
∙当表使用生成列时,对于何时可以应用数据分区消除是有限制的。
示例
示例1:
以下示例使用Informix语法,在这种情况下适合使用生成列。
在本示例中,进行分区时所基于的列存放了加拿大的省和地域。
由于省列表不大可能更改,因此生成列表达式也不大可能更改。
CREATETABLEcustomer(
cust_idINT,
cust_provCHAR
(2))
FRAGMENTBYEXPRESSION
cust_prov="AB"INdbspace_ab
cust_prov="BC"INdbspace_bc
cust_prov="MB"INdbspace_mb
...
cust_prov="YT"INdbspace_yt
REMAINDERINdbspace_remainder;
示例2:
在本示例中,使用生成列对 DB2 表进行分区:
CREATETABLEcustomer(
cust_idINT,
cust_provCHAR
(2),
cust_prov_genGENERATEDALWAYSAS(CASE
WHENcust_prov='AB'THEN1
WHENcust_prov='BC'THEN2
WHENcust_prov='MB'THEN3
...
WHENcust_prov='YT'THEN13
ELSE14END))
INtbspace_ab,tbspace_bc,tbspace_mb,....tbspace_remainder
PARTITIONBYRANGE(cust_prov_gen)
(STARTING1ENDING14EVERY1);
这里,CASE语句中的表达式与FRAGMENTBYEXPRESSION子句中的相应表达式匹配。
CASE语句将每个原始表达式映射到一个数字,该数字存储在生成列(在本示例中是cust_prov_gen)中。
此列是存储在磁盘上的真实列,因此,表占用的空间量会比DB2通过表达式直接支持的分区所必需的空间量略多。
本示例使用短语法格式。
因此,必须在CREATETABLE语句的IN子句中列示用来放置数据分区的表空间。
如果使用长语法格式,那么每个数据分区都需要不同的IN子句。
注:
这种技术可以应用于任何FRAGMENTBYEXPRESSION子句。
表分区键
表分区键是一个或多个表列的有序集合。
表分区键列中的值用来确定每个表行所属的数据分区。
要对表定义表分区键,请使用指定了PARTITIONBY子句的CREATETABLE语句。
选择有效的表分区键列对于充分利用表分区功能的优点来说十分关键。
下列准则可以帮助您为分区表选择最有效的表分区键列。
∙将范围详细程度定义为与数据转出相匹配。
最常见的情况是使用星期、月份或季度。
∙将范围定义成与数据转入大小相匹配。
最常见的情况是根据日期或时间列对数据进行分区。
∙根据有益于消除分区的列进行分区。
支持的数据类型
表1 显示了支持用作表分区键列的数据类型(包括同义词):
表1.支持的数据类型
数据类型列1
数据类型列2
SMALLINT
INTEGER
INT
BIGINT
FLOAT
REAL
DOUBLE
DECIMAL
DEC
DECFLOAT
NUMERIC
NUM
CHARACTER
CHAR
VARCHAR
DATE
TIME
GRAPHIC
VARGRAPHIC
CHARACTERVARYING
TIMESTAMP
CHARVARYING
CHARACTERFORBITDATA
CHARFORBITDATA
VARCH
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DB2 分区表