11g新特性之system partition

从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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值