现有 Table 的分区有数百万条记录

Partition on Exisiting Table with Millions of Record

我需要你在 table 拥有数百万条记录的分区上创建分区的建议。

table 定义

  1. 公司编号
  2. Type_Of_Data
  3. Emp_id
  4. 目的地
  5. Destination_id

这里针对单个公司,数据类型和 emp_id 可以不同

 COMPANY_ID   TYPE_OF_DATA EMP_ID

 A  EMP_DATA          A1   
 A  EMP_DATA          A2
 A  EMP_DATA          A3
 A  EMP_DATA          A4
 A  EMP_ADDRESS_DATA  A1   
 A  EMP_ADDRESS_DATA  A2
 A  EMP_ADDRESS_DATA  A3
 A  EMP_ADDRESS_DATA  A4
 B  EMP_DATA          B1
 B  EMP_DATA          B2
 B  EMP_DATA          B3
 B  EMP_DATA          B4
 B  EMP_ADDRESS_DATA  B1   
 B  EMP_ADDRESS_DATA  B2
 B  EMP_ADDRESS_DATA  B3
 B  EMP_ADDRESS_DATA  B4

我的基本选择是 company_id,然后是数据类型和 emp_id

我正在考虑创建一个 List - Hash 或 List -List 分区。

任何人都可以提出其他建议以及如何将分区添加到现有 table 会有所帮助

您不能向现有 "non-partitionized" table 添加任何分区。您必须创建一个新的 table 并将数据复制到其中。 查看 DBMS_REDEFINITION,它可以帮助您在不停机的情况下执行此操作。

复合 List-List 分区应该是这个:

CREATE TABLE MY_TABLE
(
COMPANY_ID VARCHAR2(100),
TYPE_OF_DATA VARCHAR2(100),
EMP_ID  VARCHAR2(10),
...
)
PARTITION BY LIST (COMPANY_ID)
    SUBPARTITION BY LIST (TYPE_OF_DATA) SUBPARTITION TEMPLATE 
        (
        SUBPARTITION EMP VALUES ('EMP_DATA'),
        SUBPARTITION EMP_ADDRESS VALUES ('EMP_ADDRESS_DATA'),
        SUBPARTITION MISCELLANEOUS VALUES (DEFAULT) -- if needed
        )
(
PARTITION COMPANY_A VALUES ('A'),
PARTITION COMPANY_B VALUES ('B'),
PARTITION COMPANY_C VALUES ('C'),
PARTITION COMPANY_OTHER VALUES (DEFAULT)
);

如果您可以在 table 中获得更多公司,请考虑改为 RANGE 分区。

您不能直接对现有的未分区 table 进行分区。您将需要根据以下方法创建一个临时 table/new table 分区:

  • DBMS_REDEFINITION

    1. 创建分区临时文件Table
    2. 开始重新定义过程
    3. 创建约束和索引(依赖项)
    4. 完成重新定义过程
  • EXCHANGE PARTITION

    1. 创建分区目标Table
    2. 交换分区
    3. SPLIT PARTITION(如果需要将单个大分区拆分成较小的分区)