阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Oracle中分区表中表空间属性

192次阅读
没有评论

共计 6537 个字符,预计需要花费 17 分钟才能阅读完成。

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

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计6537字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中