系统分区使您能够创建由多个物理分区组成的单个表。系统分区不使用分区键。相反,它创建指定的分区数。因此,结果分区没有边界(范围)、值(列表)或分区方法。
因为没有分区键,所以必须显式地将分布式表行映射到目标分区。例如,在插入行时,必须使用分区扩展语法来指定必须将行映射到的分区。
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分割分区例程。
- 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.
- The system invokes the ODCIStatsUpdPartStatistics() on the affected partitions.
- The system drops the partition that has been split from all system-partition index and statistics storage tables.
- The system adds two new partitions to the system-partitioned tables.
- 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:
- ODCIIndexExchangePartition() for the affected partition and index
- ODCIStatsExchangePartition() for the affected partition and index if statistics are collected for them