甲骨文12 c能否在2小时内在线完成一14张亿条记录的表结构字段类型变更

  

原文链接:   https://www.modb.pro/db/22782

        <>强摘要:甲骨文12 c能否在2小时内在线完成一14张亿条记录的表结构字段类型变更      
  概述
  
      <李>前面分享过甲骨文大表在线修改的脚本(在线重定义),经过几轮的测试发现,都存在些缺陷,效率始终不是很满意。这次把索引和统计信息拆出来后发现效率相对算是最高的。   <李>在线重定义的目标,是对在线业务影响最小,通过最短的锁表时间来实现表结构的变更,锁表只发生在finish_redef_table过程中,正式切换前先执行sync_interim_table过程异步同步数据,以尽可能减少业务影响。   <李>由于是要对客户的核心业务变更,按管理要求没办法提前执行finish_redef_table前的过程,且维护窗口时间有限,业务又不能完全停掉,才有了这次的测试。   <李>主要测试常见的2种场景,如下:
  
      <李>   

      <>强场景1:   
    复制全部依赖——COPY_TABLE_DEPENDENTS(索引+约束+统计信息),触发器和权限这种基本没有,就没有复制。

      <李>   

    优点:操作方便,脚本直接把原表所有依赖全部复制过去,改后的表直接使用,不需要额外处理,适合百万或千万的表,且对效率没要求可用。

      <李>   

    缺点:上亿的表测试发现效率非常低。

      <李>   

      <>强场景2:   
    有主键的表只复制约束——COPY_TABLE_DEPENDENTS(会复制主键和唯一索引),其它索引和统计信息等重定义完成后再开并行重建和收集,这里要补充说明一下为什么要复制约束,因为创建主键不能并行操作,等重定义完成数据转换后,相当于在普通大表上创建主键,效率非常低。

      <李>   

    优点:目前针对10个亿以上的表测试发现效率是最高的,14个亿的表全部弄完约2小时左右。

      <李>   

    缺点:操作过程稍微麻烦一点,别的还好。

      <李>   

    复制规则,如下:

  <>以前copy_indexes ,,,,=祝辞,0,   copy_triggers ,,,=祝辞,假的,   copy_constraints =祝辞,真的,   copy_privileges ,=祝辞,假的,   ignore_errors ,,,=祝辞,假的,   num_errors ,,,,,,=祝辞,num_errors,   copy_statistics ,=祝辞,假);   
  由于场景1的效率比较差,我这里就只列举场景2的测试过程,后续实际业务变更也是在场景2中进行,以下是整个变更过程:
  
      <李>硬软配置一般,如下:
  
      <李> CPU:英特尔?至强?CPU e7 - 4820 v3 @ 1.90 ghz(物理4个,10个核心,80个逻辑CPU)   <李>内存:500 GB李   <李>存储:华为某型号   <李>数据库软件:Oracle 12.2 Nocdb RAC,未打补丁。
  
      <李>我们先看一下原表数据行数,接近亿14条,人工造的,表实际大小和生产相差1倍以上。
  <>之前完成,select /* +,平行(40),*/,count(*),得到OM_OFFERING_INST_TEST;   ,,COUNT (*) - - - - - - - - - - - 1399999996   运行:00:00:17.39   
      <李>创建临时表,有35个分区,部份省略了,主键,索引等都不要建。
  
CREATE TABLE "CUSTINFO"."INT_OM_OFFERING_INST_TEST" (    "BUSINESS_SEQ"               VARCHAR2(20),    "PROD_ID"                    NUMBER(20, 0),    "OFFERING_INST_ID"           NUMBER(20, 0),    "OFFERING_ID"                NUMBER(20, 0),    "OFFERING_NAME"              VARCHAR2(256),    "OFFERING_CODE"              VARCHAR2(50),    "CUST_TYPE"                  VARCHAR2(20),    "CUST_ID"                    NUMBER(20, 0),    "BRAND"                      VARCHAR2(50),
  ……,,,,“RECORD_STATUS",,,,,,,,,,,,,,数量(3,0),DEFAULT  1),,,, PARTITION  BY  LIST  (,“BE_ID",), (, PARTITION “P_000", VALUES  (, & # 39; 000 & # 39;,),,,,,,,,, PARTITION “P_001", VALUES  (, & # 39; 001 & # 39;,),,,,,,,,, PARTITION “P_002", VALUES  (, & # 39; 002 & # 39;,),,,,,,,,,, PARTITION “P_100", VALUES  (, & # 39; 100 & # 39;,),,,,,,,,,, PARTITION “P_200", VALUES  (, & # 39; 200 & # 39;,),,
  .......... 

甲骨文12 c能否在2小时内在线完成一14张亿条记录的表结构字段类型变更