将现有的表和视图迁移到分区表的方法
可以通过三种方法来将现有的表或视图迁移到分区表:
- 迁移正规表时,创建一个新的空分区表并使用 LOAD from CURSOR 来将数据从旧表直接移到分区表中,而不执行任何中间步骤。
- 迁移常规表时,使用 export 实用程序或高性能卸载来卸载源表、创建一个新的空分区表并使用 LOAD 命令来填充空的分区表。
- 迁移 UNION ALL 视图时,创建一个带有单一虚拟数据分区的分区表,然后连接所有的表。
要将数据从 DB2 9.1 表迁移到分区表中,请使用 LOAD 命令来填充空的分区表。
示例 1:
假定您具有一个常规表 t1:
CREATE TABLE t1 (c1 int, c2 int);
创建新的空分区表:
CREATE TABLE sales_dp (c1 int, c2 int) PARTITION BY RANGE (c1) (STARTING FROM 0 ENDING AT 10 EVERY 2);
填充表 t1:
INSERT INTO t1 VALUES (0,1), (4, 2), (6, 3);
要避免在平面文件中创建第三份数据副本,请发出 LOAD 命令以将数据从 SQL 查询直接放入新分区表。
SELECT * FROM t1; DECLARE c1 CURSOR FOR SELECT * FROM t1; LOAD FROM c1 of CURSOR INSERT INTO sales_dp;
SELECT * FROM sales_dp;
删除旧表:
DROP TABLE t1;
可以将 UNION ALL 视图中的 DB2 9.1 数据转换到分区表中。UNION ALL 视图用于管理大型的表,它简化了表数据的转入和转出,并且提供了分支消除的性能优势。表分区功能实现了上述全部目标,并且更易于管理。通过使用 ALTER TABLE ...ATTACH 操作,可以完成转换,而不需要移动基本表中的数据。转换后,必须重新创建索引、从属视图或具体化查询表(MQT)。
建议的策略是,创建带有单一虚拟数据分区的分区表,然后连接 UNION ALL 视图的所有表。务必在处理过程中尽早删除虚拟数据分区以避免范围重叠问题。
示例 2:
UNION 中第一个表的 CREATE TABLE 语法:
CREATE TABLE sales_0198( sales_date DATE NOT NULL, prod_id INTEGER, city_id INTEGER, channel_id INTEGER, revenue DECIMAL(20,2), CONSTRAINT ck_date CHECK (sales_date BETWEEN '01-01-1998' AND '01-31-1998'));
UNION ALL 视图的 CREATE VIEW 语法:
CREATE VIEW all_sales AS ( SELECT * FROM sales_0198 WHERE sales_date BETWEEN '01-01-1998' AND '01-31-1998' UNION ALL SELECT * FROM sales_0298 WHERE sales_date BETWEEN '02-01-1998' AND '02-28-1998' UNION ALL ... UNION ALL SELECT * FROM sales_1200 WHERE sales_date BETWEEN '12-01-2000' AND '12-31-2000' );
创建带有单一虚拟分区的分区表。选择范围时,应该确保它不会与所要连接的第一个数据分区重叠:
CREATE TABLE sales_dp ( sales_date DATE NOT NULL, prod_id INTEGER, city_id INTEGER, channel_id INTEGER, revenue DECIMAL(20,2)) PARTITION BY RANGE (sales_date) (PART dummy STARTING FROM '01-01-1900' ENDING AT '01-01-1900');
连接第一个表:
ALTER TABLE sales_dp ATTACH PARTITION STARTING FROM '01-01-1998' ENDING AT '01-31-1998' FROM sales_0198;
删除虚拟分区:
ALTER TABLE sales_dp DETACH PARTITION dummy INTO dummy; DROP TABLE dummy;
连接其余的分区:
ALTER TABLE sales_dp ATTACH PARTITION STARTING FROM '02-01-1998' ENDING AT '02-28-1998' FROM sales_0298;
...
ALTER TABLE sales_dp ATTACH PARTITION STARTING FROM '12-01-2000' ENDING AT '12-31-2000' FROM sales_1200;
发出 SET INTEGRITY 语句以使连接的数据分区联机。
SET INTEGRITY FOR sales_dp IMMEDIATE CHECKED FOR EXCEPTION IN sales_dp USE sales_ex;
根据情况,创建索引。
对于特定的列,除非源列和目标列的 SYSCAT.COLUMNS IMPLICITVALUE 字段值都是非空值,并且该值不匹配,否则允许连接数据分区。在不允许连接数据分区的情况下,必须将源表删除,然后重新创建它。
如果符合下列其中一个条件,列的 SYSCAT.COLUMNS IMPLICITVALUE 字段就可以具有非空值:
- 该列是作为 ALTER TABLE ...ADD COLUMN 语句的结果创建的
- IMPLICITVALUE 字段是在连接期间从源表传播而来的
- IMPLICITVALUE 字段是在拆离期间从源表继承的
- IMPLICITVALUE 字段是从 V8 迁移到 V9 期间设置的,在 V9 中,确定该字段是添加的列,或者可能是添加的列。如果数据库无法确定该列是否是添加的列,则将其视为如此。添加的列就是作为 ALTER TABLE ...ADD COLUMN 语句的结果创建的列。
为了避免产生这些不一致,建议您始终要创建连接操作中涉及到的源表和目标表,并且这两个表定义了相同的列数。特别是,千万不要使用 ALTER TABLE 语句来向连接操作的目标表添加列。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/694276/viewspace-509797/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/694276/viewspace-509797/