Using System Partitioning

系统分区使您能够创建由多个物理分区组成的单个表。系统分区不使用分区键。相反,它创建指定的分区数。因此,结果分区没有边界(范围)、值(列表)或分区方法。

因为没有分区键,所以必须显式地将分布式表行映射到目标分区。例如,在插入行时,必须使用分区扩展语法来指定必须将行映射到的分区。

See Also:

Supporting SQL syntax in the Oracle Database SQL Language Reference

系统分区表的优点

系统分区表的主要优点是,它可以用来创建和维护相对于另一个表进行等分区的表。例如,这意味着可以创建一个依赖表作为一个系统分区表,分区数量与基本表相同。由此可见,这样一个系统分区表可以用来存储域索引的索引数据,其含义如下:

修剪遵循基本表修剪规则:当在基本表中访问一个分区时,可以在系统分区表中访问相应的分区。

基本表的ddl可以在系统分区表上复制。因此,如果删除基表上的分区,则自动删除系统分区表上的相应分区。

实现系统分区

本节描述如何实现系统分区。

创建系统分区表

Example 8-16 描述如何创建具有四个分区的系统分区表。每个分区可以有不同的物理属性。

Example 8-16 创建系统分区表

CREATE TABLE SystemPartitionedTable (c1 integer, c2 integer)
PARTITION BY SYSTEM
(
  PARTITION p1 TABLESPACE tbs_1,
  PARTITION p2 TABLESPACE tbs_2,
  PARTITION p3 TABLESPACE tbs_3,
  PARTITION p4 TABLESPACE tbs_4
);

将数据插入到系统分区表中

Example 8-17 演示如何将数据插入到系统分区表中。INSERT和MERGE语句(这里没有显示)都必须使用分区扩展语法来标识应该添加行的分区。元组(4,5)可以插入到例8-16中创建的四个分区中的任何一个。还可以使用DATAOBJ_TO_PARTITION,如下所示Example 8-18.

Example 8-17 将数据插入到系统分区表中

INSERT INTO SystemPartitionedTable PARTITION (p1) VALUES (4,5);

Example 8-18 使用以下命令将数据插入系统分区表 DATAOBJ_TO_PARTITION

INSERT INTO SystemPartitionedTable PARTITION 
  (DATAOBJ_TO_PARTITION (base_table, :physical_partid))
  VALUES (...);

注意,第一行代码显示如何将数据插入到指定的分区中,而第二行代码显示数据也可以根据分区的顺序插入到分区中。对绑定变量的支持(如第三行代码所示)非常重要,因为它允许在INSERT语句之间共享游标。

删除和更新系统分区表中的数据

虽然delete和update操作不需要分区扩展语法,但Oracle建议尽可能使用它。由于没有分区修剪,如果省略分区扩展语法,将扫描整个表来执行操作。这突出表明,行和分区之间没有隐式映射。

支持使用系统分区表进行操作

系统分区继续支持以下操作:

  • 分区维护操作和其他ddl, 但是排除以下语法:
  • ALTER INDEX SPLIT PARTITION
  • ALTER TABLE SPLIT PARTITION
  • CREATE TABLE (as SELECT)
  • 创建本地索引, 唯一的本地索引除外,因为它们需要分区键
  • 创建本地位映射索引
  • 创建全局索引
  • 所有的DML操作
  • INSERT AS SELECT operations with partition extended syntax, as shown in Example 8-19:Example 8-19 Inserting Data into a Particular Partition of a Table
INSERT INTO TableName 
  PARTITION (
    PartitionName|
    DATAOBJ_TO_PARTITION(base_table, :physical_partid))
  AS SubQuery

系统分区不再支持以下操作,因为系统分区不使用分区方法,因此不会将行分配到分区。

  • CREATE TABLE AS SELECT 另一种方法是首先创建表,然后将行插入每个分区。
  • INSERT INTO TableName AS SubQuery

运行分区维护操作

作为一个例子,本节讨论一个为域索引的基表发出的ALTER TABLE分割分区例程。

  1. The system invokes the ODCIIndexUpdPartMetadata() method using the information about the partition being added or dropped; remember that a 1:2 split involves dropping of one partition and adding two new partitions.
  2. The system invokes the ODCIStatsUpdPartStatistics() on the affected partitions.
  3. The system drops the partition that has been split from all system-partition index and statistics storage tables.
  4. The system adds two new partitions to the system-partitioned tables.
  5. If the partition that is being split is empty, then one call to ODCIIndexAlter() rebuilds the split partition, and a second call to ODCIIndexAlter() rebuilds the newly added partition.

使用索引修改表交换分区

The ALTER TABLE EXCHANGE PARTITION command is allowed for tables with domain indexes only under the following circumstances:

  • a domain index is defined on both the non-partitioned table, and the partitioned table
  • both the non-partitioned table and the partitioned table have the same associated indextype

The ALTER TABLE EXCHANGE PARTITION routine invokse the following user-implemented methods:

  1. ODCIIndexExchangePartition() for the affected partition and index
  2. ODCIStatsExchangePartition() for the affected partition and index if statistics are collected for them