ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 将现有的表和视图迁移到分区表的方法

将现有的表和视图迁移到分区表的方法

原创 Linux操作系统 作者:myfriend2010 时间:2019-04-13 08:18:06 0 删除 编辑

将现有的表和视图迁移到分区表的方法

可以通过三种方法来将现有的表或视图迁移到分区表:

  • 迁移正规表时,创建一个新的空分区表并使用 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 视图

可以将 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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-09-01

  • 博文量
    187
  • 访问量
    127086