从Oracle11g开始,开发人员和dba在选择使用分区表时更加灵活。因为在11g中,新引入了诸如reference partition, interval partition, partition virtual column,system partiton以及extended composite partition等分区类型,管理和维护方面也更加方便。
下面就来对system partition分区的使用和维护进行简单的探讨。
Oracle10g提供range,hash,list类型的分区。但有时选择分区表的时候,可能会有这样的尴尬–某些大表很难根据某个列进行分区,比如下面的例子。
SQL> desc sales
Name Null? Type
————————— ——– ———–
SALES_ID NUMBER
PRODUCT_CODE NUMBER
STATE_CODE NUMBER
这张sales表没有合适的列进行range、list分区,hash分区又不能决定数据行存放的表分区。Oracle11g中引入的system partition可以很好的解决这个问题,我们使用下面的语句重新创建sales表。
create table sales
( sales_id number,
product_code number,
state_code number)
partition by system
( partition p1,
partition p2
);
Table created.
新创建的sales表中,没有分区键值也没有设定范围。表从物理结构上分成了两个独立的段,但逻辑上仍然是一个完整的表。
SQL> select partition_name from user_segments where segment_name=’SALES’;
PARTITION_NAME
———————–
P1
P2
而在这张表上创建本地索引,同普通的分区表一样,也会创建相应的本地索引。
SQL> create index in_sales_state on sales(state_code) local;
Index created.
SQL> select partition_name from user_segments where segment_name=’IN_SALES_STATE’;
PARTITION_NAME
———————–
P1
P2
通过视图user_part_tables和user_tab_partitions,可以看出system partition既没有分区键值,没有设定范围。
SQL> select partitioning_type from user_part_tables where table_name=’SALES’;
PARTITION
————–
SYSTEM
SQL> select partition_name, high_value from user_tab_partitions where table_name=’SALES’;
PARTITION_NAME HIGH_VALUE
————– ———————
P1
P2
而尝试往该类表中插入数据时,需要显示的指定插入的分区,否则会发生ORA-14701错误。
SQL> insert into sales values (1,100,2);
insert into sales values (1,100,2)
*
ERROR at line 1:
ORA-14701: partition-extended name or bind variable must be used for DML’s on tables partitioned by the System method
SQL> insert into sales partition (p1) values (1,100,2);
1 row created.
而在删除数据时,既可以指定表分区,也可以不指定。当然,如果没有指定分区则进行全表的扫描,指定分区则只扫描指定的表分区。
SQL> delete sales where state_code = 2;
SQL> delete sales partition (p1) where state_code = 2;
1 row deleted.