更新时间:2024-05-20 GMT+08:00

交换分区

用户可以使用交换分区的命令来将分区与普通表的数据进行交换。交换分区可以快速将数据导入/导出分区表,实现数据高效加载的目的。在业务迁移的场景,使用交换分区比常规导入会快很多。交换分区可以通过指定分区名或者分区值来进行。

  • 执行交换分区命令会使得Global索引失效,可以通过UPDATE GLOBAL INDEX子句来同步更新Global索引,或者用户自行重建Global索引。
  • 执行交换分区时,可以申明WITH/WITHOUT VALIDATION,表明是否校验普通表数据满足目标分区的分区键约束规则(默认校验)。数据校验活动开销较大,如果能确保交换的数据属于目标分区,可以申明WITHOUT VALIDATION来提高交换性能。
  • 可以申明WITH VALIDATION VERBOSE,此时数据库会校验普通表的每一行,将不满足目标分区的分区键约束规则的数据,插入到分区表的其他分区中,最后再进行普通表与目标分区的交换。

例如,给出如下分区定义和普通表exchange_sales的数据分布,并将分区DATE_202001和普通表exchange_sales做交换,则根据申明子句的不同,存在以下三种行为:

  • 申明WITHOUT VALIDATION,数据全部交换到分区DATE_202001中,由于'2020-02-03', '2020-04-08'不满足分区DATE_202001的范围约束,后续业务可能会出现异常。
  • 申明WITH VALIDATION,由于'2020-02-03', '2020-04-08'不满足分区DATE_202001的范围约束,数据库给出相应的报错。
  • 申明WITH VALIDATION VERBOSE,数据库会将'2020-02-03'插入分区DATE_202002,将'2020-04-08'插入分区DATE_202004,再将剩下的数据交换到分区DATE_202001中。
    --分区定义
    PARTITION DATE_202001 VALUES LESS THAN ('2020-02-01'),
    PARTITION DATE_202002 VALUES LESS THAN ('2020-03-01'),
    PARTITION DATE_202003 VALUES LESS THAN ('2020-04-01'),
    PARTITION DATE_202004 VALUES LESS THAN ('2020-05-01')
    -- exchange_sales的数据分布
    ('2020-01-15', '2020-01-17', '2020-01-23', '2020-02-03', '2020-04-08')

如果交换的数据不完全属于目标分区,请不要申明WITHOUT VALIDATION交换分区,否则会破坏分区约束规则,导致分区表后续DML业务结果异常。

进行交换的普通表和分区必须满足如下条件:
  • 普通表和分区的列数目相同,对应列的信息严格一致。
  • 普通表和分区的表压缩信息严格一致。
  • 普通表索引和分区Local索引个数相同,且对应索引的信息严格一致。
  • 普通表和分区的表约束个数相同,且对应表约束的信息严格一致。
  • 普通表不可以是临时表。
  • 普通表和分区表上不可以有动态数据脱敏,行访问控制约束。