一直用oracle数据库,近期刚接触DB2,最近用到DB2分区表,db2的资料太少了,下面总结下db2分区表的使用及本地索引的创建。
db2分区表:使用原理跟oracle类似。最核心的是分区表会把表分区存储,在用到分区字段扫描数据时,只需要扫描数据所在分区的数据块,不需要全部扫描。两外删除更新时都很高效。
db2分区索引:分区索引的每个分区均采用 B 树结构存储,由于分区后一个大型 B 树被划分为若干小型 B 树,树的层数将会减少,这会提高数据的插入、更新、删除以及扫描的性能。同时我们执行查询时,DB2 将会采用分区消除优化方法提高扫描性能和并行性。分区消除技术帮助优化器先过滤了不需要的索引分区,只需要扫描相应的分区就能完成查询,这比扫描非分区的索引更为高效。
在我们使用 Alter table 语句的 Attach Partition 子句将数据 Roll in 或者 Roll Out 分区表时,分区索引将特别有用。如果使用非分区索引,那么必须先发出 Set Integrity 语句,新添加的分区中的数据才能进入联机状态。这个过程可能非常消耗时间,并可能消耗大量日志空间。当使用分区索引时这些开销将会被消除。
一个分区表可以同时存在分区索引和非分区索引。如果创建分区索引,那个每个索引分区将都包含单个数据分区的索引条目,索引叶子节点中的 RID 也将只指向单个数据分区。一个分区表可以同时存在分区索引和非分区索引。如果创建分区索引,那个每个索引分区将都包含单个数据分区的索引条目,索引叶子节点中的 RID 也将只指向单个数据分区。
分区表创建:
drop table DW_DEP_ACCT_DETAIL_HISTORY;commit; CREATE TABLE DW_DEP_ACCT_DETAIL_HISTORY ( DATA_DT VARCHAR(8) NOT NULL, CYC VARCHAR(4) NOT NULL, ORG_ID VARCHAR(8), CUST_TYPE VARCHAR(8), CS_NO VARCHAR(12), CU_ID VARCHAR(30) NOT NULL, ACCT_NAME VARCHAR(100), AGE VARCHAR(4), REGI_ADDR VARCHAR(200), EDUCATION VARCHAR(8), PRDT_ID VARCHAR(8), ACCT_ID VARCHAR(30) NOT NULL, BG_DT VARCHAR(8), ED_DATE VARCHAR(8), OPN_STAFF VARCHAR(10), BAL DECIMAL(16,2), LAST_YEAR_PERIOD_BAL DECIMAL(16,2), DAY_AVG_BAL DECIMAL(16,2), LAST_YEAR_AVG_BAL DECIMAL(16,2), SURPLUS_TP VARCHAR(10), STAFF_FL VARCHAR(8), LOAN_CUS_FL VARCHAR(8), DEP_LOAN_FL VARCHAR(8), chsx varchar(8) not null , loan_bal DECIMAL(16,2), PRIMARY KEY (CU_ID, ACCT_ID, DATA_DT, CYC,chsx) ) PARTITION BY RANGE(DATA_DT) ( STARTING '20130601' , STARTING '20130701' ENDING