当前位置:Gxlcms > 数据库问题 > Oracle中分区表中表空间属性

Oracle中分区表中表空间属性

时间:2021-07-01 10:21:17 帮助过:2人阅读

从上面的查询可以知道,表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包来查看索引的建表语句:

技术分享从上图可以看到索引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。修改成功。



本文出自 “DBA Fighting!” 博客,请务必保留此出处http://hbxztc.blog.51cto.com/1587495/1929585

Oracle中分区表中表空间属性

标签:oracle 分区 表空间

人气教程排行