设为首页 收藏本站
查看: 1230|回复: 0

[经验分享] Oracle中分区表中表空间属性

[复制链接]

尚未签到

发表于 2018-9-6 12:39:00 | 显示全部楼层 |阅读模式
  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的语句:
DSC0000.png

  从上图中可以看出表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
  
------------------------------ ------------------ ------------------------------
  
P11 EXAMPLE
  
P22 SYSTEM
  
P33 USERS
  
P44 USERS
  
P55 EXAMPLE
  从上面的查询可以看出,local分区索引上没有表空间信息,而每个索引分区对应的表空间名与相应的分区所在的表空间一致。我们同样使用dbms_metadata包来查看索引的建表语句:
DSC0001.png 从上图可以看到索引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
  
------------------------------ ------------------ ------------------------------
  
P11 SYSAUX
  
P22 SYSAUX
  
P33 SYSAUX
  
P44 SYSAUX
  
P55 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 t 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
  
------------------------------ ------------------ ------------------------------
  
P11 SYSAUX
  
P22 SYSAUX
  
P33 SYSAUX
  
P44 SYSAUX
  
P55 SYSAUX
  
P66 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 t 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
  
------------------------------ ------------------ ------------------------------
  
P11 SYSAUX
  
P22 SYSAUX
  
P33 SYSAUX
  
P44 SYSAUX
  
P55 SYSAUX
  
P66 SYSAUX
  
P77 USERS
  从上面的结果可以看出,新加分区对应的分区索引的表空间变为了新指定的USERS。修改成功。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-564075-1-1.html 上篇帖子: Oracle RAC环境下的应用连续性 下篇帖子: oracle em启动失败--ORACLE_UNQNAME not defined
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表