Oracle中分区表中表空间属性

简介:

Oracle中的分区表是Oracle中的一个很好的特性,可以把大表划分成多个小表,从而提高对于该大表的SQL执行效率,而各个分区对应用又是透明的。

分区表中的每个分区有独立的存储特性,包括表空间、PCT_FREE等。那分区表中的各分区表空间之间有什么关系?新建的分区会创建在哪个表空间中呢?对应的local分区索引又会使用哪个表空间呢?下面使用一个例子来解释上面的这些问题。

创建测试分区表:

1
2
3
4
5
6
7
8
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视图中查看对应的表空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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的语句:

wKioL1km3uaiZzdhAAC7zPV8vnE762.png

从上图中可以看出表T其实也是有表空间属性的,就是在建表时指定的USERS表空间。而分区P3继承了这一属性。那为什么说是分区P3继承了这一属性呢,我们查询下面的视图:

1
2
3
4
5
6
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添加一个表空间:

1
2
3
4
5
6
7
8
9
10
11
12
zx@TEST> alter  table  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,证实了前面的观点。

如果当前的表空间已经无法扩展,想把新加的分区创建到其他表空间中,而在加表空间时不指定表空间信息,可以实现么?答案是肯定可以。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
zx@TEST> alter  table  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  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分区索引对应的表空间。先在表上创建一个分区索引。

1
2
3
zx@TEST> create  index  idx_t  on  t(id)  local ;
 
Index  created.

下面看看local分区索引对应的表空间的属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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包来查看索引的建表语句:

wKiom1km5cmT08hBAADhEurAxtg660.png从上图可以看到索引IDX_T确实没有表空间属性。我们再来查看user_part_index来验证一下是否是真的呢:

1
2
3
4
5
6
7
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分区索引所在的表空间与表分区所在的表空间分开来么?答案是肯定可以的。在创建本地索引进指定表空间参数即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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表空间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
zx@TEST> alter  table  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。

下面来看如何修改新分区索引创建的对应的表空间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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  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。修改成功。







      本文转自hbxztc 51CTO博客,原文链接:http://blog.51cto.com/hbxztc/1929585,如需转载请自行联系原作者



相关文章
|
6月前
|
存储 Oracle NoSQL
Oracle 表空间、数据文件、schema的关系
Oracle 表空间、数据文件、schema的关系
187 2
|
SQL 监控 Oracle
Oracle创建和管理表空间
Oracle创建和管理表空间
98 1
|
Oracle 关系型数据库 数据库
9-4 Oracle管理表空间和数据文件
9-4 Oracle管理表空间和数据文件
123 0
|
3月前
|
Oracle 关系型数据库 数据库
[oracle]拆分多用户的公共表空间
[oracle]拆分多用户的公共表空间
|
4月前
|
存储 监控 Oracle
关系型数据库Oracle空间不足
【7月更文挑战第15天】
61 6
|
4月前
|
存储 Oracle 关系型数据库
关系型数据库Oracle 空间不足
【7月更文挑战第16天】
54 2
|
6月前
|
Kubernetes Oracle 关系型数据库
实时计算 Flink版产品使用合集之是否支持 Oracle 分区表
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标属性:数据的“导航仪”与“仪表盘”
【4月更文挑战第19天】Oracle PL/SQL游标属性如同车辆的导航仪和仪表盘,提供丰富信息和控制。 `%FOUND`和`%NOTFOUND`指示数据读取状态,`%ROWCOUNT`记录处理行数,`%ISOPEN`显示游标状态。还有`%BULK_ROWCOUNT`和`%BULK_EXCEPTIONS`增强处理灵活性。通过实例展示了如何在数据处理中利用这些属性监控和控制流程,提高效率和准确性。掌握游标属性是提升数据处理能力的关键。
|
6月前
|
存储 数据库
发现oracle10gSYSAUX空间没有了进行处理
发现oracle10gSYSAUX空间没有了进行处理
40 0
|
6月前
|
SQL Oracle 关系型数据库
Oracle 数据泵导出导入(映射表空间、Schema)
Oracle 数据泵导出导入(映射表空间、Schema)