2. IQ 15表分区的使用:
下面一个例子说明IQ 15 表分区的用法和注意事项:
(1) 创建分区表
CREATE TABLE bar (
c1 INT,
c2 DATE,
c3 VARCHAR(10)
)
PARTITION BY RANGE(c2)
( p1 VALUES <= ('2005-12-31') IN dbsp1,
p2 VALUES <= ('2006-12-31') IN dbsp2,
P3 VALUES <= ('2007-12-31') IN dbsp3,
P4 VALUES <= ('2008-12-31') IN dbsp4
);
INSERT INTO bar VALUES(3, '2007-01-01', 'banananut');
INSERT INTO BAR VALUES(4, '2007-09-09', 'grapejam');
INSERT INTO BAR VALUES(5, '2008-05-05', 'applecake');
(2) 把未分区表改为分区表
CREATE TABLE bar (
c1 INT,
c2 DATE,
c3 VARCHAR(10)
);
INSERT INTO bar VALUES(3, '2007-01-01', 'banananut');
INSERT INTO BAR VALUES(4, '2007-09-09', 'grapejam');
INSERT INTO BAR VALUES(5, '2008-05-05', 'applecake');
假设有如上语句创建的表bar,并且bar表中已经存放了用户数据。如果打算对这张表进行分区,那么应该如何做呢?主要有两种方法:
方法1:使用ALTER TABLE PARTITION BY语句
ALTER TABLE bar PARTITION BY RANGE(c2)
( p1 VALUES <= ('2005-12-31') IN dbsp1,
P2 VALUES <= ('2006-12-31') IN DBSP2,
P3 VALUES <= ('2007-12-31') IN dbsp3,
P4 VALUES <= ('2008-12-31') IN dbsp4
);
如果使用上面的语句把未分区的表进行分区,会报"All rows must be in the first partition." 即,IQ 15要求在对为分区表进行分区时,未分区表中的全部已有记录必须位于头一个分区中。所以,需要使用下面的语句进行分区:
ALTER TABLE bar PARTITION BY RANGE(c2)
( p1 VALUES <= ('2008-12-31') IN dbsp1,
P2 VALUES <= ('2009-12-31') IN dbsp2,
P3 VALUES <= ('2010-12-31') IN dbsp3,
P4 VALUES <= ('2011-12-31') IN dbsp4
);
如果P1的分区边界上限为2008-12-31,那么所有的已存在记录的c2列值都比他小,满足要求。
方法2:创建一个新表然后从源表中导入数据
CREATE TABLE bar_pt (
c1 INT,
c2 DATE,
c3 VARCHAR(10)
)
PARTITION BY RANGE(c2)
( p1 VALUES <= ('2005-12-31') IN dbsp1,
p2 VALUES <= ('2006-12-31') IN dbsp2,
P3 VALUES <= ('2007-12-31') IN dbsp3,
P4 VALUES <= ('2008-12-31') IN dbsp4
);
INSERT INTO bar_pt SELECT * FROM bar;
COMMIT;
DROP TABLE bar;
ALTER TABLE bar_pt rename bar;
(3) 分区move
ALTER TABLE bar MOVE PARTITION p2 TO DBSP5;
(4) 分区split
ALTER TABLE bar SPLIT PARTITION p4 INTO
( P41 VALUES <= ('2008-06-30') IN dbsp4,
P42 VALUES <= ('2008-12-31') IN dbsp4
);
上面的语句把分区P4细分为两个分区P41和P42。在split分区时,记录(5, '2008-05-05', 'applecake')位于P41分区,没有发生数据移动,所以split分区可成功执行!
ALTER TABLE bar SPLIT PARTITION p3 INTO
( P31 VALUES <= ('2007-06-30') IN dbsp3,
P32 VALUES <= ('2007-12-31') IN dbsp3
);
执行上面的把P3分区split的语句会报:"No data move is allowed, cannot split partition p3." 。因为在split分区时,记录(4, '2007-09-09', 'grapejam')需要移动到P32分区,这是不允许的(也就是说split分区时不能发生数据移动!)。
ALTER TABLE bar SPLIT PARTITION p2 INTO
( P21 VALUES <= ('2006-06-30') IN dbsp2,
P22 VALUES <= ('2006-12-01') IN dbsp2
);
执行上面的把P3分区split的语句会报:"Boundary value for the partition p2 cannot be changed." 因为在P22分区改变了原来P2分区定义时的边界,原来是VALUES <= ('2006-12-31'),要改为VALUES <= ('2006-12-01')。
分区Split的限制:
(1) split分区时不能发生数据移动
(2) split分区时不能改变原分区定义时的边界值
(5) 分区merge
在执行merge分区时需要注意:在IQ 15中,两个分区只有是相邻的并且两个分区位于相同的dbspace时才能merge,此外,只能把低分区值的分区merge到具有较高分区值的分区(而不能反之)。例如下面的merge语句在执行时会报"Partition 'p2' is not adjacent to or before partition'p3'."错:
ALTER TABLE bar MERGE PARTITION p3 into p2;
因为P3分区的边界值为<= ('2007-12-31'),而P2分区的边界值为<= ('2006-12-31')。那么如下语句也不行(虽然满足了边界值条件):
ALTER TABLE bar MERGE PARTITION p2 into p3;
因为P2分区和P3分区在不同的dbspace上。所以为了实现分区的合并,需需要如下步骤:
ALTER TABLE bar MOVE PARTITION p2 TO dbsp3;
ALTER TABLE bar MERGE PARTITION p2 into p3;
(6) 分区重命名
ALTER TABLE bar RENAME PARTITION p1 TO p1_new;
上面的语句把分区p1改名为p1_new。
(7) 删除一个分区
ALTER TABLE bar DROP PARTITION p1;
上面的语句把分区p1删除(包括定义和数据)
此外truncate table语句可以清除指定分区中的数据,不过这种方法是row-based的操作,所以性能相对较慢。示例如下:
TRUNCATE TABLE bar PARTITION p2;
(8) 把分区表改为未分区表(UNPARTITION)
ALTER TABLE bar UNPARTITION;
注意:上面的语句ALTER TABLE UNPARTITION将阻塞所有的数据库活动(包括用户登录IQ)。
(9) 对表分区执行dbcc检查
下面是针对分区使用dbcc的一些例子:
sp_iqcheckdb 'allocation table bar partition p2 database resources 50'
sp_iqcheckdb 'check table bar partition p2 database resources 50'
sp_iqcheckdb 'verify table bar partition p2 database resources 50'
sp_iqcheckdb 'allocation table bar partition p2,p1 database resources 50'?
sp_iqcheckdb 'allocation table bar partition p1 partition p2 database resources 50'
阅读(1782) | 评论(0) | 转发(0) |