「这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战」
当使用在线重定义功能进行非分区表转换时,过程中需要对中间表进行索引,约束等依赖进行重建,Oracle提供了两种方式:
本文参考:oracle-base.com/articles/mi…
一、COPY_TABLE_DEPENDENTS
使用DBMS_REDEFINITION包自带的procedure:DBMS_REDEFINITION.copy_table_dependents来实现:
1 | sql复制代码SET SERVEROUTPUT ON |
用法可参考官方文档:docs.oracle.com/en/database…
Table 134-7 COPY_TABLE_DEPENDENTS Procedure Parameters
1 | sql复制代码DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS( |
此方式的优缺点:
优点:可以根据你传入的参数,选择需要复制的依赖,有索引,触发器,约束,权限,统计信息。当重定义dbms_redefinition.finish_redef_table之后,会自动切换这些依赖到分区表中,不需要人为rename操作。
缺点:使用此方式复制的索引,会保留非分区表的索引类型,依然是GLOBAL的全局索引,并不会根据分区自动转换为LOCAL本地索引。
Notes:如果不考虑将索引建为LOCAL本地索引,可以使用如上方式进行复制。
二、手动创建
通过手动创建索引,指定LOCAL本地索引方式创建,但是需要在重定义dbms_redefinition.finish_redef_table之后,手动重新rename。
1 | sql复制代码-- Add new keys, FKs and triggers. |
优点:可以根据用户的需求,以适当的方式来创建索引等依赖。
缺点:由于是用户自己创建并且切换,所以需要有一定的基础,不能漏掉任何依赖,需要考虑完全。
三、COPY_TABLE_DEPENDENTS + 手动创建索引
也可以通过组合使用,通过COPY_TABLE_DEPENDENTS来复制其他依赖,索引手动创建。
1 | sql复制代码--排除索引 |
优点:综合上述两种方式,此方式只需要关注索引是否遗漏,无需关注触发器,权限,约束等依赖。
本文转载自: 掘金