yangtingkun
===========================================================
本地分区索引如何确定表空间
===========================================================

表和索引建立的时候如果不指定表空间,会建立在用户的默认表空间中。对于分区表和分区索引,则确定建立的表空间的规则要复杂一些,本文进行简单的总结。


分区表的分区增加分区如果不指定表空间,会根据分区表的默认表空间,如果分区表没有指定默认表空间,则建立在用户的默认表空间上。参考例一。

复合分区表增加子分区如果不指定表空间,会根据分区上的默认表空间,如果分区上没有指定,则根据表上面的默认表空间,如果表上也没有指定,则建立在用户的默认表空间上。参考例二。

分区索引的情况比分区还要复杂一些。由于本地索引会随着增加分区的操作自动增加,因此,无法明确的为这个索引分区指定表空间。如果在建立分区索引时,没有给出默认表空间,那么新增的索引分区所在表空间和新增表分区所在表空间保持一致。参考例三。

复合分区索引的情况和分区索引类似。当复合分区表增加子分区时,如果复合分区索引给出了分区默认表空间,则新建的索引子分区建立在索引分区默认表空间上,如果分区一级没有明确致命默认表空间,则依据索引一级的默认表空间创建新子分区,如果索引一级仍然没有设置明确设置表空间,则索引子分区的表空间和表中子分区的表空间保持一致。参考例四。

例一:分区表增加分区

SQL> SELECT DEFAULT_TABLESPACE FROM USER_USERS;

DEFAULT_TABLESPACE
------------------------------
YANGTK

SQL> CREATE TABLE TEST (ID NUMBER)
2 TABLESPACE USERS
3 PARTITION BY RANGE (ID)
4 (
5 PARTITION P1 VALUES LESS THAN (100)
6 TABLESPACE TEST
7 );

表已创建。

SQL> CREATE TABLE TEST1 (ID NUMBER)
2 PARTITION BY RANGE (ID)
3 (
4 PARTITION P1 VALUES LESS THAN (100)
5 TABLESPACE TEST
6 );

表已创建。

SQL> ALTER TABLE TEST ADD PARTITION P2 VALUES LESS THAN (200);

表已更改。

SQL> ALTER TABLE TEST1 ADD PARTITION P2 VALUES LESS THAN (200);

表已更改。

SQL> SELECT TABLE_NAME, TABLESPACE_NAME FROM USER_TAB_PARTITIONS
2 WHERE PARTITION_NAME = 'P2';

TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
TEST USERS
TEST1 YANGTK

SQL> DROP TABLE TEST;

表已丢弃。

SQL> DROP TABLE TEST1;

表已丢弃。

例二:复合分区表增加子分区

SQL> SELECT DEFAULT_TABLESPACE FROM USER_USERS;

DEFAULT_TABLESPACE
------------------------------
YANGTK

SQL> CREATE TABLE TEST (TIME DATE, STATE VARCHAR2(10))
2 TABLESPACE TOOLS
3 PARTITION BY RANGE (TIME) SUBPARTITION BY LIST (STATE)
4 (
5 PARTITION P1 VALUES LESS THAN (TO_DATE('2004-1-1', 'YYYY-MM-DD'))
6 TABLESPACE USERS
7 (
8 SUBPARTITION SP1 VALUES ('BJ')
9 TABLESPACE TEST
10 )
11 )
12 ;

表已创建。

SQL> CREATE TABLE TEST1 (TIME DATE, STATE VARCHAR2(10))
2 TABLESPACE TOOLS
3 PARTITION BY RANGE (TIME) SUBPARTITION BY LIST (STATE)
4 (
5 PARTITION P1 VALUES LESS THAN (TO_DATE('2004-1-1', 'YYYY-MM-DD'))
6 (
7 SUBPARTITION SP1 VALUES ('BJ')
8 TABLESPACE TEST
9 )
10 )
11 ;

表已创建。

SQL> CREATE TABLE TEST2 (TIME DATE, STATE VARCHAR2(10))
2 PARTITION BY RANGE (TIME) SUBPARTITION BY LIST (STATE)
3 (
4 PARTITION P1 VALUES LESS THAN (TO_DATE('2004-1-1', 'YYYY-MM-DD'))
5 (
6 SUBPARTITION SP1 VALUES ('BJ')
7 TABLESPACE TEST
8 )
9 )
10 ;

表已创建。

SQL> ALTER TABLE TEST MODIFY PARTITION P1 ADD SUBPARTITION SP2 VALUES ('SH');

表已更改。

SQL> ALTER TABLE TEST1 MODIFY PARTITION P1 ADD SUBPARTITION SP2 VALUES ('SH');

表已更改。

SQL> ALTER TABLE TEST2 MODIFY PARTITION P1 ADD SUBPARTITION SP2 VALUES ('SH');

表已更改。

SQL> SELECT TABLE_NAME, TABLESPACE_NAME FROM USER_TAB_SUBPARTITIONS
2 WHERE SUBPARTITION_NAME = 'SP2';

TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
TEST USERS
TEST1 TOOLS
TEST2 YANGTK

SQL> DROP TABLE TEST;

表已丢弃。

SQL> DROP TABLE TEST1;

表已丢弃。

SQL> DROP TABLE TEST2;

表已丢弃。

例三:本地索引分区

SQL> SELECT DEFAULT_TABLESPACE FROM USER_USERS;

DEFAULT_TABLESPACE
------------------------------
YANGTK

SQL> CREATE TABLE TEST (ID NUMBER, NAME VARCHAR2(30))
2 TABLESPACE USERS
3 PARTITION BY RANGE (ID)
4 (
5 PARTITION P1 VALUES LESS THAN (100)
6 TABLESPACE TEST
7 );

表已创建。

SQL> CREATE TABLE TEST1 (ID NUMBER, NAME VARCHAR2(30))
2 PARTITION BY RANGE (ID)
3 (
4 PARTITION P1 VALUES LESS THAN (100)
5 TABLESPACE TEST
6 );

表已创建。

SQL> CREATE INDEX IND_TEST_1 ON TEST (ID) LOCAL;

索引已创建。

SQL> CREATE INDEX IND_TEST_2 ON TEST (NAME)
2 TABLESPACE INDX LOCAL;

索引已创建。

SQL> CREATE INDEX IND_TEST1_1 ON TEST1 (ID) LOCAL;

索引已创建。

SQL> CREATE INDEX IND_TEST1_2 ON TEST1 (NAME)
2 TABLESPACE INDX LOCAL;

索引已创建。

SQL> ALTER TABLE TEST ADD PARTITION P2 VALUES LESS THAN (200);

表已更改。

SQL> ALTER TABLE TEST1 ADD PARTITION P2 VALUES LESS THAN (200);

表已更改。

SQL> SELECT TABLE_NAME, TABLESPACE_NAME FROM USER_TAB_PARTITIONS
2 WHERE PARTITION_NAME = 'P2';

TABLE_NAME TABLESPACE_NAME
-------------------- --------------------
TEST USERS
TEST1 YANGTK

SQL> SELECT TABLE_NAME, A.INDEX_NAME, A.TABLESPACE_NAME
2 FROM USER_IND_PARTITIONS A, USER_INDEXES B
3 WHERE PARTITION_NAME = 'P2'
4 AND A.INDEX_NAME = B.INDEX_NAME
5 ORDER BY 1, 2;

TABLE_NAME INDEX_NAME TABLESPACE_NAME
-------------------- -------------------- --------------------
TEST IND_TEST_1 USERS
TEST IND_TEST_2 INDX
TEST1 IND_TEST1_1 YANGTK
TEST1 IND_TEST1_2 INDX

SQL> DROP TABLE TEST;

表已丢弃。

SQL> DROP TABLE TEST1;

表已丢弃。

例四:复合分区索引

SQL> SELECT DEFAULT_TABLESPACE FROM USER_USERS;

DEFAULT_TABLESPACE
------------------------------
YANGTK

SQL> CREATE TABLE TEST (ID NUMBER, TIME DATE, STATE VARCHAR2(10))
2 TABLESPACE TOOLS
3 PARTITION BY RANGE (TIME) SUBPARTITION BY LIST (STATE)
4 (
5 PARTITION P1 VALUES LESS THAN (TO_DATE('2004-1-1', 'YYYY-MM-DD'))
6 TABLESPACE USERS
7 (
8 SUBPARTITION SP1 VALUES ('BJ')
9 TABLESPACE TEST
10 )
11 )
12 ;

表已创建。

SQL> CREATE TABLE TEST1 (ID NUMBER, TIME DATE, STATE VARCHAR2(10))
2 TABLESPACE TOOLS
3 PARTITION BY RANGE (TIME) SUBPARTITION BY LIST (STATE)
4 (
5 PARTITION P1 VALUES LESS THAN (TO_DATE('2004-1-1', 'YYYY-MM-DD'))
6 (
7 SUBPARTITION SP1 VALUES ('BJ')
8 TABLESPACE TEST
9 )
10 )
11 ;

表已创建。

SQL> CREATE TABLE TEST2 (ID NUMBER, TIME DATE, STATE VARCHAR2(10))
2 PARTITION BY RANGE (TIME) SUBPARTITION BY LIST (STATE)
3 (
4 PARTITION P1 VALUES LESS THAN (TO_DATE('2004-1-1', 'YYYY-MM-DD'))
5 (
6 SUBPARTITION SP1 VALUES ('BJ')
7 TABLESPACE TEST
8 )
9 )
10 ;

表已创建。

SQL> CREATE INDEX IND_TEST_1 ON TEST (ID) LOCAL;

索引已创建。

SQL> CREATE INDEX IND_TEST_2 ON TEST (TIME)
2 TABLESPACE INDX LOCAL;

索引已创建。

SQL> CREATE INDEX IND_TEST_3 ON TEST (STATE)
2 LOCAL (PARTITION P1 TABLESPACE SYSTEM)
3 TABLESPACE INDX;

索引已创建。

SQL> CREATE INDEX IND_TEST1_1 ON TEST1 (ID) LOCAL;

索引已创建。

SQL> CREATE INDEX IND_TEST1_2 ON TEST1 (TIME)
2 TABLESPACE INDX LOCAL;

索引已创建。

SQL> CREATE INDEX IND_TEST1_3 ON TEST1 (STATE)
2 LOCAL (PARTITION P1 TABLESPACE SYSTEM)
3 TABLESPACE INDX;

索引已创建。

SQL> CREATE INDEX IND_TEST2_1 ON TEST2 (ID) LOCAL;

索引已创建。

SQL> CREATE INDEX IND_TEST2_2 ON TEST2 (TIME)
2 TABLESPACE INDX LOCAL;

索引已创建。

SQL> CREATE INDEX IND_TEST2_3 ON TEST2 (STATE)
2 LOCAL (PARTITION P1 TABLESPACE SYSTEM)
3 TABLESPACE INDX;

索引已创建。

SQL> ALTER TABLE TEST MODIFY PARTITION P1 ADD SUBPARTITION SP2 VALUES ('SH');

表已更改。

SQL> ALTER TABLE TEST1 MODIFY PARTITION P1 ADD SUBPARTITION SP2 VALUES ('SH');

表已更改。

SQL> ALTER TABLE TEST2 MODIFY PARTITION P1 ADD SUBPARTITION SP2 VALUES ('SH');

表已更改。

SQL> SELECT TABLE_NAME, TABLESPACE_NAME FROM USER_TAB_SUBPARTITIONS
2 WHERE SUBPARTITION_NAME = 'SP2';

TABLE_NAME TABLESPACE_NAME
-------------------- ------------------------------
TEST USERS
TEST1 TOOLS
TEST2 YANGTK

SQL> SELECT TABLE_NAME, A.INDEX_NAME, A.TABLESPACE_NAME
2 FROM USER_IND_SUBPARTITIONS A, USER_INDEXES B
3 WHERE SUBPARTITION_NAME = 'SP2'
4 AND A.INDEX_NAME = B.INDEX_NAME
5 ORDER BY 1, 2;

TABLE_NAME INDEX_NAME TABLESPACE_NAME
-------------------- -------------------- -----------------------
TEST IND_TEST_1 USERS
TEST IND_TEST_2 INDX
TEST IND_TEST_3 SYSTEM
TEST1 IND_TEST1_1 TOOLS
TEST1 IND_TEST1_2 INDX
TEST1 IND_TEST1_3 SYSTEM
TEST2 IND_TEST2_1 YANGTK
TEST2 IND_TEST2_2 INDX
TEST2 IND_TEST2_3 SYSTEM

已选择9行。

yangtingkun 发表于:2005.03.07 16:59 ::分类: ( ORACLE ) ::阅读:(10107次) :: 评论 (13)
[回复]

其实就是每个对应的对象都继承对应的上级对象所具有的相关属性, 当然这个属性也宝包括他的对应的默认表空间.

子分区 继承 分区的相关默认表空间,以及默认表空间的默认的属性.
分区 继承 表对象的默认表空间. 以及对应的空间管理的相关参数
表 继承 用户的默认表空间 以及对应的表空间的默认的存储参数.
用户 如果在创建的时候, 继承系统的默认表空间/系统的默认临时表空间相关特性^_^.

jametong 评论于: 2005.03.08 13:41
[回复]

你说的没错。

其实我这里想要强调的是后面两个例子,分区索引并没有完全按照这个规则。

yangtingkun 评论于: 2005.03.08 16:20
help [回复]

我用的是最后一种分区方式,并且有一个local索引,当我扩充索引时,我发现根本改不了表空间,它提示
ORA-14287:不能 REBUILD (重建) 组合范围分区的索引的分区
我怎么修改索引分区的表空间

cwy 评论于: 2005.03.10 15:11
[回复]

你用的复合分区吧?复合分区不能直接在分区一级rebuild索引,必须到子分区一级去。

这里描述不清楚,你可以到论坛里面把你的问题描述清楚一些。

yangtingkun 评论于: 2005.03.10 15:20
[回复]

你有没有msn,我们可以聊一下吗

chuwenyong 评论于: 2005.03.10 15:58
[回复]

把问题发到论坛中吧。你可以通过论坛的悄悄话将你的帖子的链接发给我。

yangtingkun 评论于: 2005.03.10 16:19
re: 本地分区索引如何确定表空间 [回复]

写错一句话了。
“如果在建立分区索引时,给出了默认表空间,那么新增的索引分区所在表空间和新增表分区所在表空间保持一致。参考例三。”
应该是
“如果在建立分区时。。。。。。”

ora110 评论于: 2007.12.14 16:55
re: 本地分区索引如何确定表空间 [回复]

感谢指出

应该是:
如果建立分区索引时没有指定默认的表空间,那么新增的索引分区所在表空间和新增表分区所在表空间保持一致。

yangtingkun 评论于: 2007.12.16 20:10
re: 本地分区索引如何确定表空间 [回复]

记住了.谢谢.

haorman 评论于: 2008.02.26 10:58
re: 本地分区索引如何确定表空间 [回复]

对于域索引如何分区啊?并且指定不同的存储表空间。

阿华 评论于: 2008.06.10 16:44
re: 本地分区索引如何确定表空间 [回复]

这个就要具体问题具体分析了,不同的域索引的实现也是不同的

yangtingkun 评论于: 2008.06.11 00:24
re: 本地分区索引如何确定表空间 [回复]

在oracle的文档中已经看到了解决办法...

阿华 评论于: 2008.06.12 17:10
re: 本地分区索引如何确定表空间 [回复]

不要看…前天晚上,晚自习回家,被大卡车撞死,司机被扔在路边的湖里,看到这个信息一定要转发六个评论台,不发者你的母亲会在半个月内被卡车撞死,对不起位,办法,看到

a 评论于: 2012.05.01 01:42

发表评论
标题

在此添加评论
表情符号: smile laughing tongue angry crying sad wassat wink

称呼

邮箱地址(可选)

个人主页(可选)

 authimage


切换风格
新闻聚合
博客日历
文章归档...
最新发表...
最新评论...
最多阅读文章...
最多评论文章...
博客统计...
Blog信息
网站链接...