从上面的查询可以看出,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。修改成功。