结合一级分区

当表有DDL操作时,不仅仅是与某个子分区表相关的索引会置为无效,所有表上的索引都会失效。如果后面有update_index_clause子句,要保证索引是可以失效的,如果无法失效,要设置其为不可用,如主键索引,否则该DDL操作无法进行。

指定update_all_index_clause子句只影响局部分区索引,index为LOCAL主分区索引,如果指定索引名称,则表示该操作更新的是该主分区索引下与基础表的子分区表相关联的子分区索引。如果不指定索引名称,默认更新所有的局部主分区索引下与基础表的子分区表相关联的子分区索引。LOCAL 索引的子分区数必须与基础表的子分区数相等。partition/subpartition更新子分区索引的新名称;如果不指定,则更新后的索引与基础表的子分区表的名称相同。tablespace_name表示指定子分区索引的表空间为tablespace_name。

ALTER TABLE … COALESCE PARTITION语句用于结合一个哈希分区表的一级子分区表,结合后的分区表有如下规则:

  1. 结合分区后,全局分区索引与全局非分区索引都会变为无效。
  2. 结合分区后,与新分区表相关联的局部子分区索引及局部主分区索引将失效。
  3. 由于支持一级子分区表为哈希分区的复合分区,所以也可以对复合分区中的一级分区进行结合操作。如果二级子分区表不对称,那么将会引起数据的逐条移动,消耗较多的时间。
  4. 如果结合的是复合分区中的二级子分区表,那么:
  • 如果分区表有分区模板,则按照分区模板合并;
  • 如果没有分区模板,则把所有数据合并成一个二级子分区表;
  • 如果二级子分区表为范围分区类型,则创建一个maxvalue的二级子分区表合并数据;
  • 如果二级子分区表为列表分区类型,则创建一个DEFAULT的二级子分区表合并数据;
  • 如果二级子分区表为哈希分区类型,则创建一个哈希桶的二级子分区表合并数据。

示例:减少一定数量的子分区表

--  清理环境
DROP TABLE tab;
DROP TABLESPACE ts1;
DROP TABLESPACE ts2;

--  创建表空间
CREATE TABLESPACE ts1 DATAFILE 'ts1.dt' SIZE 5M AUTOEXTEND ON NEXT 5M;
CREATE TABLESPACE ts2 DATAFILE 'ts2.dt' SIZE 5M AUTOEXTEND ON NEXT 5M;

-- 创建分区表
CREATE TABLE tab 
(
    c1 int, 
    c2 int
)
PARTITION BY HASH(c1)
(
    PARTITION HP1 TABLESPACE ts1,
    PARTITION HP2 TABLESPACE ts2
);

ALTER TABLE tab COALESCE PARTITION;

--  删除表和表空间
DROP TABLE tab CASCADE;
DROP TABLESPACE ts1;
DROP TABLESPACE ts2;