内容简介: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的静态分区与动态分区
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数学与泛型编程
[美]亚历山大 A. 斯捷潘诺夫(Alexander A. Stepanov)、[美]丹尼尔 E. 罗斯(Daniel E. Rose) / 爱飞翔 / 机械工业出版社 / 2017-8 / 79
这是一本内容丰富而又通俗易懂的书籍,由优秀的软件设计师 Alexander A. Stepanov 与其同事 Daniel E. Rose 所撰写。作者在书中解释泛型编程的原则及其所依据的抽象数学概念,以帮助你写出简洁而强大的代码。 只要你对编程相当熟悉,并且擅长逻辑思考,那么就可以顺利阅读本书。Stepanov 与 Rose 会清晰地讲解相关的抽象代数及数论知识。他们首先解释数学家想要解决......一起来看看 《数学与泛型编程》 这本书的介绍吧!