龙空技术网

11g特性之system partition

重庆思庄 107

前言:

现在看官们对“oracle11g创建分区”都比较注重,咱们都想要剖析一些“oracle11g创建分区”的相关内容。那么小编在网络上搜集了一些关于“oracle11g创建分区””的相关内容,希望咱们能喜欢,朋友们一起来了解一下吧!

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

标签: #oracle11g创建分区 #oracle10g分区