1

我有一个包含大量数据的表格,并且正在客户端生产。我必须对其进行在线分区,这意味着我可以停止生产并且应该对表进行分区。我有脚本来做这件事。但我不知道如何在网上进行。他们是我可以实现这一目标的任何方式。请建议..

4

1 回答 1

3

按照以下步骤,

  1. 在与主表相同的结构中创建临时表(例如 TABLE_P 用于 TABLE),并将此临时表分区到所需的列上。不要将主表的主键和其他索引添加到这个临时表中。

    create table TABLE_P
        (
          COL1        VARCHAR2(35 CHAR) not null,
          COL2        VARCHAR2(35 CHAR) not null,
        )
        --add partition (Example taken here is Range partitioning)  from here
         PARTITION BY RANGE (COL1) (
         PARTITION p0 VALUES LESS THAN (5),
         PARTITION p1 VALUES LESS THAN (10),
         PARTITION p2 VALUES LESS THAN (15),
         PARTITION p3 VALUES LESS THAN (MAXVALUE)
        --add partition till here
    
  2. 使用所需列创建此表的索引。

    create index IX01_TABLE on TABLE_P (COL1) local;         
    
  3. 运行以下脚本进行重新定义。替换为实际的架构名称。

    begin
    dbms_redefinition.can_redef_table( 'SCHEMA', 'TABLE' );
    end;
    /
    
    begin
    dbms_redefinition.start_redef_table('SCHEMA', 'TABLE','TABLE_P' );
    end;
    /
    
    declare
      error_count pls_integer := 0;
    BEGIN
      dbms_redefinition.copy_table_dependents(uname      => 'SCHEMA',
                                              orig_table => 'TABLE',
                                              int_table  => 'TABLE_P',
                                              num_errors => error_count);
      dbms_output.put_line('errors := ' || to_char(error_count));
    END;
    /
    
    begin
    dbms_redefinition.finish_redef_table('SCHEMA', 'TABLE','TABLE_P');
    end;
    /
    

请注意,这将使依赖对象在架构中变为无效,因此请准备好一些停机时间以清除这些无效。

于 2013-01-08T06:38:15.290 回答