内容简介:Oracle中分区表中表空间属性
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的语句:
从上图中可以看出表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包来查看索引的建表语句:
从上图可以看到索引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。修改成功。
更多Oracle相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址 : http://www.linuxidc.com/Linux/2017-05/144270.htm
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 论文浅尝 | 知识图谱推理中表示学习和规则挖掘的迭代学习方法
- 无需任何神经网络!Uber AI 在 Atari 游戏蒙特祖玛的复仇中表现远超人类
- db2 定义分区表和分区键
- HBase漫谈 | HBase分区过多影响&合理分区数量
- 大数据开发学习之Hive的静态分区与动态分区
- 好程序员大数据培训之掌握Hive的静态分区与动态分区
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Programming Python
Mark Lutz / O'Reilly Media / 2006-8-30 / USD 59.99
Already the industry standard for Python users, "Programming Python" from O'Reilly just got even better. This third edition has been updated to reflect current best practices and the abundance of chan......一起来看看 《Programming Python》 这本书的介绍吧!