Oracle中分区表中表空间属性

栏目: 数据库 · Oracle · 发布时间: 6年前

内容简介: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 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 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 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

从上面的查询可以看出,local分区索引上没有表空间信息,而每个索引分区对应的表空间名与相应的分区所在的表空间一致。我们同样使用dbms_metadata包来查看索引的建表语句:

Oracle中分区表中表空间属性

从上图可以看到索引IDX_T确实没有表空间属性。我们再来查看user_part_index来验证一下是否是真的呢:

zx@TEST>col index_name  for a30
zx@TEST>col def_tablespace_name  for a30
zx@TEST> select index_name,def_tablespace_name  from user_part_indexes  where index_name= 'IDX_T' ;
 
INDEX_NAME             DEF_TABLESPACE_NAME
------------------------------ ------------------------------
IDX_T

从上面的查询中可以看到索引IDX_T也没有默认的表空间存储选项,而在官方文档中看到: New partitions or subpartitions added to the local index will be created in the same tablespace(s) as the corresponding partitions or subpartitions of the underlying table。 说明local分区索引默认与相关联的表分区在同一个表空间,上面的查询也可以验证这一结论。那可以把local分区索引所在的表空间与表分区所在的表空间分开来么?答案是肯定可以的。在创建本地索引进指定表空间参数即可:

zx@TEST> drop index idx_t;
 
Index dropped.
 
zx@TEST> create index idx_t  on t(id)  local tablespace sysaux;
 
Index created.
 
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 SYSAUX
P2                      2 SYSAUX
P3                      3 SYSAUX
P4                      4 SYSAUX
P5                      5 SYSAUX
 
zx@TEST> select index_name,def_tablespace_name  from user_part_indexes  where index_name= 'IDX_T' ;
 
INDEX_NAME             DEF_TABLESPACE_NAME
------------------------------ ------------------------------
IDX_T                 SYSAUX

从上面的查询中可以看到所有的分区索引的表空间都为SYSAUX。

创建一个新的分区,看对应的分区索引是否还是在SYSAUX表空间:

zx@TEST> alter table add partition p6  values less than (60);
 
Table altered.
 
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 SYSAUX
P2                      2 SYSAUX
P3                      3 SYSAUX
P4                      4 SYSAUX
P5                      5 SYSAUX
P6                      6 SYSAUX

从上面可以看出新的分区索引所在的表空间仍是SYSAUX。

下面来看如何修改新分区索引创建的对应的表空间:

zx@TEST> alter index idx_t  modify default attributes tablespace users;
 
Index altered.
 
zx@TEST> select index_name,def_tablespace_name  from user_part_indexes  where index_name= 'IDX_T' ;
 
INDEX_NAME             DEF_TABLESPACE_NAME
------------------------------ ------------------------------
IDX_T                 USERS
 
zx@TEST> alter table add partition p7  values less than (70);
 
Table altered.
 
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 SYSAUX
P2                      2 SYSAUX
P3                      3 SYSAUX
P4                      4 SYSAUX
P5                      5 SYSAUX
P6                      6 SYSAUX
P7                      7 USERS

从上面的结果可以看出,新加分区对应的分区索引的表空间变为了新指定的USERS。修改成功。

更多Oracle相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址 http://www.linuxidc.com/Linux/2017-05/144270.htm


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算机体系结构

计算机体系结构

John L. Hennessy、David A. Patterson / 机械工业出版社 / 2012-1 / 138.00元

编辑推荐 “本书之所以成为永恒的经典,是因为它的每一次再版都不仅仅是更新补充,而是一次全面的修订,对这个激动人心且快速变化领域给出了最及时的信息和最独到的解读。对于我来说,即使已有二十多年的从业经历,再次阅读本书仍自觉学无止境,感佩于两位卓越大师的渊博学识和深厚功底。” ——Luiz André Barroso,Google公司 内容简介 本书堪称计算机系统结构学科的“圣经......一起来看看 《计算机体系结构》 这本书的介绍吧!

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具