技术开发 频道

改进大型数据库的管理:管理分区表

【IT168 技术文档】
管理分区表

    这个实验将查看如何管理和操作分区表:

1.您将添加和删除分区。
2.您将执行对分区的转入转出操作。
3.在执行查看操作时将使用 DB2 命令和 SQL。

使用现有的表添加一个新的分区 

    将数据导入 LINEITEM 表。创建表空间的 SQL 位于 EX3-1.sql 文件中,可使用下面的命令运行该文件:

清单 37. 导入数据

db2 –vtf EX3-1.sql










图 16. 将数据导入到 LINEITEM 表 

    注意:分区表中的记录数,以及将进行连接和分离的记录数对于说明数据库中的数据何时可用非常重要。 

    创建一个名为 NP_LINEITEM 的新表。脚本 EX3-2.sql 创建一个具有 87 行的新表 NP_LINEITEM:

清单 38. 新分区

db2 –vtf EX3-2.sql



图 17. 将数据导入到 NP_LINEITEM 表 

    使用下面的命令说明为 LINEITEM 表创建的分区范围:

清单 39. 说明

db2 describe data partitions for table LINEITEM show detail



图 18. LINEITEM 表的分区 

    注意:LINEITEM 表目前包含 4 个数据分区。 

    使用 Alter 语句将一个新的分区连接(转入)到现有的 LINEITEM 表。


清单 40. 新分区

ALTER TABLE LINEITEM ATTACH PARTITION JAN1994
STARTING '1/1/1994' ENDING '30/6/1994'
FROM NP_LINEITEM 

    可以使用以下命令运行脚本 EX3-4:

清单 41. 新分区

db2 –vtf EX3-4.sql



图 19. 脚本 EX3-4 

    注意:LINEITEM 表被置于 SET INTEGRITY PENDING 状态。 

    连接后,使用 describe data partitions 命令来说明为 LINEITEM 表创建的分区范围:

清单 42. 说明

db2 describe data partitions for table LINEITEM show detail



图 20. LINEITEM 表的分区

    注意:新数据分区(JAN1994)PartitionId 4 现在连接到了 LINEITEM 表。然而连接的分区的 AccessMode 值为 ‘N’ 并且 Status 的值为 ‘A’。 
    AccessMode 可能的值有:

D = 没有数据移动
F = 完全访问
N = 不访问
R = 只读访问 

    Status 可能的值有:

A = 数据分区是新连接的
D = 数据分区是分离的
I = 只有在执行异步索引清除时才对条目位于目录的分离的数据分区进行维护;当所有引用分离数据分区的索引记录删除后,将删除 STATUS 值为 ‘I’ 的行。
Empty string = 数据分区是可见的(普通状态) 

    运行两个 select count 语句来检查连接语句涉及的两个表中数据的可用性。

清单 43. Count Lineitem

db2 “select count(*) from lineitem”



图 21. select count 语句的结果 

    注意:LINEITEM 表最初的分区是可用的,但是 PartitionId 4 中的新数据仍不可见。 

    清单 44. Count np-lineitem

db2 “select count(*) from np_lineitem”



图 22. select count 语句的结果 

    注意:NP_LINEITEM 表现在是一个未定义的对象,在 LINEITEM 表内只能将其作为一个分区使用。 

    创建一个异常表并与 SET INTEGRITY 语句结合使用。执行该操作的 DDL 位于 EX3-7.sql 文件,可使用下面的命令运行该文件: 

    清单 45. 异常表

db2 –vtf EX3-7.sql 

    对 LINEITEM 分区表运行 set integrity 语句 。 

    清单 46. 设置完整性

SET INTEGRITY FOR LINEITEM
ALLOW WRITE ACCESS
IMMEDIATE CHECKED
FOR EXCEPTION IN LINEITEM USE LINEITEM_EX 

    执行该操作的 SQL 位于 EX3-8.sql 文件中,可以使用下面的命令运行该文件: 

    清单 47. 设置完整性

db2 –vtf EX3-8.sql


图 23. EX3-8.sql 文件 

    注意:SET INTEGRITY 对于检查新连接的数据是否在范围内是必需的,它还执行对索引和其他独立对象(例如物化查询表)所有必需的维护工作。只有得到 SET INTEGRITY 语句的允许,新的数据才能变为可见。然而,当运行 SET INTEGRITY 时,可以对 LINEITEM 表中的现有数据进行完全访问,包括读和写操作。
用户应该执行 SET INTEGRITY 事务从而能够使用整个表。当运行 SET INTEGRITY 时,不能够对表执行 DDL 或其他实用类型的操作。 

    在这个练习中,在 NP_LINEITEM 表中创建并被连接到 LINEITEM 表的所有的行,都在连接语句指定的范围内。如果这些行中存在超出此范围的行,则需要在 SET INTEGRITY 语句中创建一个异常表来防止语句发生错误。所以推荐您始终在 SET INTEGRITY 语句中包含一个异常表。如果没有提供异常表的话,SET INTEGRITY 语句发现的错误将导致语句失败并且所有的工作都必须从头做起。如果使用大量数据时,这可能是一个长期操作。有一点值得注意,如果 SET INTEGRITY 操作失败,所有工作都需要重做,与之相比较,LOAD 仅仅抛弃存在问题的行。 

    对 LINEITEM 表运行 select count SQL 以检查连接的分区中数据的可用性:

清单 48. Count Lineitem

db2 “select count(*) from lineitem”



图 24. select count 语句的结果 

    注意:成功执行 SET INTEGRITY 操作后,LINEITEM 表应包含 PartitionId 4 的数据。

从分区表中分离一个分区 

    使用 describe data partitions show detail 命令来标识一个分区的 PartitionName,您将把这个分区从 LINEITEM 分区表中分离(转出)出来。 

    清单 49. 说明表

db2 describe data partitions for table LINEITEM show detail



图25. LINEITEM 表的分区 

    注意:将分离最早的分区范围 PartitionId 0。该分区的 PartitionName 是 JAN1992。将在 DETACH 操作中使用它来标识被转出的分区。同样还需注意成功执行了 SET INTEGRITY 操作后,分区 JAN1994 的 AccessMode 的值为 ‘F’,Status 值为空。TableSpId、PartObjId 和 LongTblSpId 的结果可能和这里显示的不一样。 

    使用 Alter 语句将 JAN1992 从 LINEITEM 表中分离(转出)。 

    清单 50. Alter 表

ALTER TABLE LINEITEM DETACH PARTITION JAN1992 INTO LINEITEM_JAN1992 

    创建文件的 SQL 位于 EX3-11.sql 文件中,可使用下面的命令运行该文件: 

    清单 51. Alter 表

db2 –vtf EX3-11.sql. 

    注意:将 JAN1992 成功分离后,将创建一个新的表 LINEITEM_JAN1992。在 DETACH 操作中没有涉及数据移动,并且位于相同表空间的新表的行为和它作为 LINEITEM 分区表的一部分时是一样的。此时不需要对 LINEITEM 表运行 SET INTEGRITY 语句,因为没有对 LINEITEM 表定义的 MQTs。 

    还有一点值得注意,如果从 Multi-Dimensional Clustering(MDC)分离一个分区从而创建了一个新表时,这个表也将是一个 MDC。这个规则同样适用于下面这个情况:从一个分布式表中分离分区从而在相同的分区组创建分布式表。执行 DETACH 操作后产生的表使用 MDC 索引定义而不是其他的索引。对于 MDC,在首次访问连接的表时将重新构建索引。在这种情况下,将自动对分离的分区进行索引清除操作。将从执行 DETACH 操作的用户 ID 继承索引的模式、权限和表空间。
 
    运行两个 select count 语句检查 DETACH 语句涉及的两个表中的数据的可用性。 

    清单 52. Count Lineitem_jan1992

db2 “select count(*) from lineitem_jan1992”








图 26. select count 语句的结果 

    注意:创建的 LINEITEM_JAN1992 表包含 38 行,它被包含在 LINEITEM 分区表的 JAN1992 分区中。 

    清单 53. Count lineitem

db2 “select count(*) from lineitem”



图 27. select count 语句的结果 

    注意:此时 LINEITEM 表完全可用,并且不包括 PART0 中的数据。 

    当数据被移动到分区表中,或当希望将数据加载到或直接插入分区表中时,一个更合适的方法是向现有的分区表添加一个空的分区。使用下面的命令向现有的 LINEITEM 表添加一个空的分区: 

    清单 54. 说明

db2 “ALTER TABLE LINEITEM ADD PARTITION JULY1994 STARTING '1/7/1994' ENDING '31/12/1994'”



图 28. 向现有的 LINEITEM 表添加一个空的分区 

    使用 describe data partitions show detail 命令来检验 PartitionName 为 JULY1994 的分区是否被添加到 LINEITEM 中: 

    清单 55. 说明

db2 describe data partitions for table LINEITEM show detail



图 29. LINEITEM 表的分区

0
相关文章