Oracle中分区表中表空间属性-创新互联

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

创新互联公司是网站建设技术企业,为成都企业提供专业的成都网站设计、做网站,网站设计,网站制作,网站改版等技术服务。拥有10余年丰富建站经验和众多成功案例,为您定制适合企业的网站。10余年品质,值得信赖!

分区表中的每个分区有独立的存储特性,包括表空间、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

从上面的查询可以看出,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 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 ------------------------------ ------------------ ------------------------------ 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 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 ------------------------------ ------------------ ------------------------------ P1 1 SYSAUX P2 2 SYSAUX P3 3 SYSAUX P4 4 SYSAUX P5 5 SYSAUX P6 6 SYSAUX P7 7 USERS

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

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。

网页标题:Oracle中分区表中表空间属性-创新互联
文章分享:https://www.cdcxhl.com/article46/djjoeg.html

成都网站建设公司_创新互联,为您提供网站导航面包屑导航网站设计移动网站建设网站策划网页设计公司

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都网站建设公司