如何把非分区索引移植为分区索引
分区索引是 DB2 V9.7 中的新特性,但是在实际环境中,我们经常需要把数据库从一个之前的 DB2 版本移植到更新的 DB2 版本上来,对于移植到 DB2 V9.7 上的旧数据库来说,其中分区表上的索引都是非分区索引,这种情况下如何将非分区索引移植为分区索引而且要保证索引一直可用?
一个可行的方法是,创建一个分区索引,具有与原有的非分区索引相同的定义,在这个新索引建立的过程中,原有的非分区索引仍然可用,当新索引创建完成之后,删掉原有的非分区索引,最后用命令“ RENAME INDEX … TO … ”把新索引更改为与原有索引相同的名字。这是移植过程全部完成,整个过程中始终有索引可用。提示: DB2 V9.7 中允许在相同的一个或多个列上分别创建一个分区索引和一个非分区索引。
分区索引如何提高性能
之前提到,分区索引带来的一个显著优势在于,在使用 ALTER TABLE ATTACH PARTITION 和 DETAICH PARTITION 命令进行数据的转入( roll-in )和转出( roll-out) 时, 使用分区索引能够很大程度的提高性能。
在使用分区索引特性之前,分区表上的所有索引都是非分区索引,在进行数据的转入( roll-in )和转出( roll-out) 时,需要对索引进行维护,包括在数据的转入时需要在索引中建立新的键值对新数据分区作索引(如图 4 所示),在数据的转出时需要将索引中相应的键值清除(如图 5 所示)。当索引很大的时候,这些维护工作需要非常的代价,将会严重影响数据库系统的性能。
在 DB2 V9.7 上有了分区索引特性,当分区表上只有分区索引时,这时的进行数据的转入和转出变得更加便捷。如图 6 所示,表 SalesTab 有两个数据分区和两个分区索引,表 New_table 是一个相同结构的普通表,并创建了相同定义的两个索引。
当使用数据转入方式把表 New_table 连接(ATTACH)到表 SalesTab 上时,表 New_table 的数据将成为表 SalesTab 的一个数据分区,表 New_table 上的两个索引分别成为表 SalesTab 上分区索引的新的索引分区,然后执行 Set Integrity 命令是所有的数据可用。整个过程不需要任何的数据移动,也不需要大量的索引维护,只需要很少的代价在很短的时间可以完成。类似的,当需要数据转出时,被转出的数据分区成为新表的数据对象,原有的分区索引的索引分区成为新表上的索引。
当然,在实际应用环境中可能遇到一些情况仍然需要对索引进行维护,例如
目标表上的分区索引在源表上没有定义;
源表上的索引与目标表上索引不一致;
目标表上既有分区索引又有非分区索引。
另外, DB2 V9.7 的优化器对分区索引也有相应的处理,能够根据情况选择更加优化的执行计划。限于篇幅以及复杂性,这个主题不在此介绍。
总结
本文可以使读者获得 DB2 V9.7 的分区索引特性的第一手体验,包括什么是分区索引,如何创建和维护分区索引,并且分析了分区索引带来的性能提高。分区索引这一特性,能够给数据仓库、商业智能数据库系统带来性能上的巨大的提高。