Oracle分区表

Posted Binggo30

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle分区表相关的知识,希望对你有一定的参考价值。

  最近因为业务上客户数据的表空间占用过大,而想通过删除一部分数据来缩小表空间文件的大小无法实现,故想到使用分区表来实现

分区表分为范围分区(range)、哈希分区(hash)、列表分区(list)、以及一些组合分区(range-hash、range-list)

以下为各个分区的创建语法:

1、范围分区(range)

  简介:

    

  语法:

1     CREATE TABLE 表名 (列定义) partition by range(列名)
2      (
3       partition  分区名  values less than (值),
4       。。。。
5       partition 分区名 values less than (maxvalue)  ###默认分区
6      );

 

 

 

2、哈希分区(hash)

  简介:

 

  语法:

技术分享
1     CREATE TABLE 表名 (列定义) partition by hash(列名)
2      (
3       partition  分区名  tablespace 表空间名,
4       。。。。
5       partition 分区名  tablespace 表空间名
6      );
View Code

 

 

 

注:指定每个分区的表空间,用于分散在各个数据文件中。

 

3、列表分区(list)

  简介:

    需要指定列的值,其分区值必须明确指定,该分区列只能有一个,不能像range或者hash分区那样同时指定多个列作为分区依赖列,但它的单个分区对应值可以是多个。

    注:在列表分区中,必须明确分区列可能存在的值,一旦插入的列值不在分区范围内,则插入/更新就会失败,因此通常建议使用列表分区时,要创建一个default分区存储那些不存在指定范围内的记录。

  语法:

技术分享
1     CREATE TABLE 表名 (列定义) partition by list(列名)
2      (
3       partition  分区名 values (值1,值2,值3....),
4       。。。。
5       partition 分区名  values (default)
6      );
View Code

 

4、组合分区

  简介:

    如果某表按照某列分区之后,仍然较大或其他需求,还可以通过分区内再建子分区的方式将分区再分区,即组合分区的方式。

  语法:

  

 

分区表的常见操作:

  查询分区表:

     select table_name,partition_name from user_tab_partitions where table_name = 表名; 

   查询对应分区表中数据

     select * from 表名 partition (分区名); 

  添加分区:

     alter table 表名 add partition values(值) tablespace 表空间名;  

  拆分分区(split):  

alter table 表名 split partition 分区名 {at | values} (值)
  into (partition 新分区名 tablespace 空间名,partition 新分区名 tablespace 空间名....);

  注:标红处,列表为range类型,使用at;列表为list类型使用values;

  合并分区(merge):

    相邻的分区可以merge为一个分区,新分区的下边界为原来边界值较低的分区,上边界为原来值较高的分区,原来的局部牵引相应也会合并,全局索引会失效,需要rebuild。

     alter table 表名 merge partitions 分区名1,分区名2... into partition 新分区名;

  移动分区(move)

     alter table 表名 move partition 分区名 tablespace 空间名; 

   注:分区移动会自动维护局部分区索引,Oracle不会自动维护全局索引,所以需要重新rebuild分区索引。

 

    提升:具体需要rebuild哪些索引,可以通过dba_part_indexs,dba_ind_partitions去判断

     select index_name,status from user_indexs where table_name = 表名; 

    查询局部索引:

       select owner,index_name,table_name,partitioning_type from dba_part_indexes where index_name = 索引名 

       select index_owner,index_name,partition_name from dba_ind_partitions where index_name = 索引名; 

  删除分区数据(truncate)

     alter table 表名 truncate partition (分区名); 

    注:turncate相对delete操作快,数据仓库中的大量数据的批量数据加载可能会有用到;

    截断分区同样会自动维护局部分区索引,同时会使全局索引unusable,需要重建。

 

  删除分区(drop)

     alter table 表名 drop partition 分区名; 

    同样会自动维护局部分区索引,同时会使全局索引unusable,需要重建。

 

 

分区索引

  分为本地索引(local index) 和 全局索引(global index),局部索引比全局索引容易管理而全局索引比较快。

本地索引

  语法:

   

技术分享
1 CREATE INDEX IND_表名 on 表名(列)
2     local (
3         partition 分区名 tablespace 空间名,
4         partition 分区名 tablespace 空间名,
5         ....);
View Code

 

 

 

以上是关于Oracle分区表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Toad for Oracle 中使用自定义代码片段?

Oracle:相对日期和日期分区表

ORACLE 分区表分区拆分

Oracle表分区

Client / Server Interoperability Support Matrix for Different Oracle Versions (Doc ID 207303.1)(代码片段

ORACLE分区表自动清理分区