Oracle中分区表中表空间属性

Oracle中的分区表是Oracle中的一个很好的特性,可以把大表划分成多个小表,从而提高对于该大表的SQL执行效率,而各个分区对应用又是透明的。

分区表中的每个分区有独立的存储特性,包括表空间、PCT_FREE等。那分区表中的各分区表空间之间有什么关系?新建的分区会创建在哪个表空间中呢?对应的local分区索引又会使用哪个表空间呢?下面使用一个例子来解释上面的这些问题。

创建测试分区表:

zx@TEST>create table t (id number,name varchar2(10))

  2  tablespace users

  3  partition by range(id)

  4  (

  5  partition p1 values less than (10) tablespace example,

  6  partition p2 values less than (20) tablespace system,

  7  partition p3 values less than (30)

  8  );

上面创建了一个range分区表T,对表T指定了表空间为users,分区p1表空间为example,分区p2表空间为system,分区p3表空间没有指定。

下面分别从user_tables、user_tab_partitions视图中查看对应的表空间

zx@TEST>col tablespace_name for a30

zx@TEST>col partition_name for a30

zx@TEST>select tablespace_name,partitioned from user_tables where table_name='T';

  

TABLESPACE_NAME           PARTITION

------------------------------ ---------

                   YES

  

zx@TEST>select partition_name,tablespace_name from user_tab_partitions where table_name='T';

  

PARTITION_NAME             TABLESPACE_NAME

------------------------------ ------------------------------

P1                 EXAMPLE

P2                 SYSTEM

P3                 USERS

从上面的查询可以看出,分区表T在user_tables视图中没有记录表空间名的信息,分区P1和P2对应的分区与建表语句中指定的一致,分区P3对应的分区与表T指定的表空间一致为USERS。难道表T就没有表空间属性么?我们使用dbms_metadata.get_ddl查看表T的语句:

Oracle中分区表中表空间属性

从上图中可以看出表T其实也是有表空间属性的,就是在建表时指定的USERS表空间。而分区P3继承了这一属性。那为什么说是分区P3继承了这一属性呢,我们查询下面的视图:

zx@TEST>col table_name for a30

zx@TEST>select table_name,def_tablespace_name from user_part_tables;

  

TABLE_NAME             DEF_TABLESPACE_NAME

------------------------------ ---------------------------------

T                 USERS

官方文档对列def_tablespace_name的解释是Default tablespace to be used when adding a partition。从上面的查询可以知道,表T的分区如果没有明确指定表空间时都会使用USERS表空间。事实是这样么,下面给表T添加一个表空间:

zx@TEST>alter table t add partition p4 values less than (40);

  

Table altered.

  

zx@TEST>select partition_name,tablespace_name from user_tab_partitions where table_name='T';

  

PARTITION_NAME             TABLESPACE_NAME

------------------------------ ------------------------------

P1                 EXAMPLE

P2                 SYSTEM

P3                 USERS

P4                 USERS

从上面可以看到,新添加的分区P4对应的表空间是USERS,证实了前面的观点。

如果当前的表空间已经无法扩展,想把新加的分区创建到其他表空间中,而在加表空间时不指定表空间信息,可以实现么?答案是肯定可以。

zx@TEST>alter table t modify default attributes tablespace example;

  

Table altered.

  

zx@TEST>select table_name,def_tablespace_name from user_part_tables;

  

TABLE_NAME             DEF_TABLESPACE_NAME

------------------------------ ------------------------------------------------------------------------------------------

T                 EXAMPLE

  

zx@TEST>alter table t add partition p5 values less than (50);

  

Table altered.

  

zx@TEST>select partition_name,tablespace_name from user_tab_partitions where table_name='T';

  

PARTITION_NAME             TABLESPACE_NAME

------------------------------ ------------------------------

P1                 EXAMPLE

P2                 SYSTEM

P3                 USERS

P4                 USERS

P5                 EXAMPLE

从上面可以看到在修改了表T的表空间属性后,新加的分区P5创建在EXAMPLE表空间中。

下面再来看local分区索引对应的表空间。先在表上创建一个分区索引。

zx@TEST>create index idx_t on t(id) local;

  

Index created.

下面看看local分区索引对应的表空间的属性:

zx@TEST>select tablespace_name,partitioned from user_indexes where index_name='IDX_T';

  

TABLESPACE_NAME           PARTITION

------------------------------ ---------

                   YES

  

zx@TEST>select partition_name,partition_position,tablespace_name from user_ind_partitions where index_name='IDX_T';

  

PARTITION_NAME             PARTITION_POSITION TABLESPACE_NAME

------------------------------ ------------------ ------------------------------

P1                      1 EXAMPLE

P2                      2 SYSTEM

P3                      3 USERS

P4                      4 USERS

P5                      5 EXAMPLE

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a1233c3ea8c5fc0a5156483a7cfbabb2.html