一、什么是分区表

Oracle提供了分区技术以支持VLDB(Very Large DataBase)。分区表通过对分区列的判断,把分区列不同的记录,放到不同的分区中。分区完全对应用透明。

Oracle的分区表可以包括多个分区,每个分区都是一个独立的段(SEGMENT),可以存放到不同的表空间中。查询时可以通过查询表来访问各个分区中的数据,也可以通过在查询时直接指定分区的方法来进行查询。

二、什么时候用分区表

When to Partition a Table什么时候需要分区表,官网的2个建议如下:

(1)Tables greater than 2GB should always be considered for partitioning.

(2)Tables containing historical data, in which new data is added into the newest partition. A typical example is a historical table where only the current month’s data is updatable and the other 11 months are read only.

三、分区表优点

(1)由于将数据分散到各个分区中,减少了数据损坏的可能性;

(2)可以对单独的分区进行备份和恢复;

(3)可以将分区映射到不同的物理磁盘上,来分散IO;

(4)提高可管理性、可用性和性能。

四、分区表类型

(1)范围分区(range)——我们这篇博文的内容;

(2)哈希分区(hash);

(3)列表分区(list);

(4)范围-哈希复合分区(range-hash);

(5)范围-列表复合分区(range-list)。

五、Range分区

Range分区是应用范围比较广的表分区方式,它是以列的值的范围来做为分区的划分条件,将记录存放到列值所在的range分区中。

如按照时间划分,2010年1月的数据放到a分区,2月的数据放到b分区,在创建的时候,需要指定基于的列,以及分区的范围值。

在按时间分区时,如果某些记录暂无法预测范围,可以创建maxvalue分区,所有不在指定范围内的记录都会被存储到maxvalue所在分区中。

六、Range分区实例说明

例子:创建一张表,表有两个字段(ID、TIME),我们完成对TIME列的范围分区,即将1-12月创建成对应的12个分区表,对分区表及分区表数据进行增删查改操作。

创建分区表:

创建表同时完成对表进行分区(按月份分区)

Oracle PL/SQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

/*创建分区表*/

createtablepdba(idnumber,timedate)partitionbyrange(time)

(

partitionp1valueslessthan(to_date('2013-02-1','yyyy-mm-dd')),

partitionp2valueslessthan(to_date('2013-03-1','yyyy-mm-dd')),

partitionp3valueslessthan(to_date('2013-04-1','yyyy-mm-dd')),

partitionp4valueslessthan(to_date('2013-05-1','yyyy-mm-dd')),

partitionp5valueslessthan(to_date('2013-06-1','yyyy-mm-dd')),

partitionp6valueslessthan(to_date('2013-07-1','yyyy-mm-dd')),

partitionp7valueslessthan(to_date('2013-08-1','yyyy-mm-dd')),

partitionp8valueslessthan(to_date('2013-09-1','yyyy-mm-dd')),

partitionp9valueslessthan(to_date('2013-10-1','yyyy-mm-dd')),

partitionp10valueslessthan(to_date('2013-11-1','yyyy-mm-dd')),

partitionp11valueslessthan(to_date('2013-12-1','yyyy-mm-dd')),

partitionp12valueslessthan(to_date('2014-01-1','yyyy-mm-dd'))

--partition p13 values less than (maxvalue)    --不建议使用

)

查询所有分区表,验证分区表是否创建成功。

Oracle PL/SQL

1

select*fromALL_TAB_PARTITIONSa--不能加任何where条件

结果如下图:

0f37209ca3d48861d58724ae9a0e7f0d.png

添加数据:

为了测试效果,我们添加120万条数据,每月添加10万条数据:

Oracle PL/SQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

/*添加数据*/

declare

begin

fornin1..100000LOOP

-- insert into sale_data select * from sale_data;

insertintopdbaVALUES(1,to_date('2013-01-05','yyyy-mm-dd'));

insertintopdbaVALUES(2,to_date('2013-02-05','yyyy-mm-dd'));

insertintopdbaVALUES(3,to_date('2013-03-05','yyyy-mm-dd'));

insertintopdbaVALUES(4,to_date('2013-04-05','yyyy-mm-dd'));

insertintopdbaVALUES(5,to_date('2013-05-05','yyyy-mm-dd'));

insertintopdbaVALUES(6,to_date('2013-06-05','yyyy-mm-dd'));

insertintopdbaVALUES(7,to_date('2013-07-05','yyyy-mm-dd'));

insertintopdbaVALUES(8,to_date('2013-08-05','yyyy-mm-dd'));

insertintopdbaVALUES(9,to_date('2013-09-05','yyyy-mm-dd'));

insertintopdbaVALUES(10,to_date('2013-10-05','yyyy-mm-dd'));

insertintopdbaVALUES(11,to_date('2013-11-05','yyyy-mm-dd'));

insertintopdbaVALUES(12,to_date('2013-12-05','yyyy-mm-dd'));

endloop;

end;

测试数据是否添加正确:

先查看物理表记录:

Oracle PL/SQL

1

2

/*验证*/

selectcount(*)frompdba

结果如下图:

3c62d58816192b815160fd79cfc5f2bf.png

再随机查看分区表,数据, 比如我们查看12月份的分区表数据,理论应该是10W条。

Oracle PL/SQL

1

2

/*分区表查询*/

selectcount(*)frompdbapartition(p12)--一月份

结果如下图:

6c0a22e7638a9fb6a5de0ee70ddd487b.png

至此我们创建、验证、并向表中添加数据 完成。

查询分区表:

Oracle PL/SQL

1

2

/*分区表查询*/

select*frompdbapartition(p12)--十二月份

删除分区表:

(数据也会被删除)

Oracle PL/SQL

1

2

/*删除分区表*/

ALTERTABLEpdbaDROPPARTITIONP12;

当我们再次查询十二月份的分区表时:

Oracle PL/SQL

1

2

/*分区表查询*/

select*frompdbapartition(p12)--十二月份

结果如下:

016b1c6568d30509b42d377dff941bf5.png

而我们物理表中数据也会减少10w条。

Oracle PL/SQL

1

selectcount(*)frompdba

结果如下:

abf412c33ef76bb28456572eee73daff.png

增加分区表:

现在的物理表只有1到11月份的分区表,那我们再次添加12月份的分区表并再次添加10w条数据

Oracle PL/SQL

1

2

/*增加分区表*/

ALTERTABLEpdbaADDPARTITIONP12VALUESLESSTHAN(TO_DATE('2014-01-01','YYYY-MM-DD'));

添加数据:

Oracle PL/SQL

1

2

3

4

5

6

7

/*添加数据*/

declare

begin

fornin1..100000LOOP

insertintopdbaVALUES(12,to_date('2013-12-05','yyyy-mm-dd'));

endloop;

end;

再次查询十二月份的分区表验证操作是否成功

Oracle PL/SQL

1

2

/*分区表查询*/

selectcount(*)frompdbapartition(p12)--十二月份

结果如图:

bfa0bd5adcd065834d3ce6c1cb971c91.png

合并分区表:

例子:将11月和12月的分区表合并在一起。

Oracle PL/SQL

1

2

/*合并分区表*/

ALTERTABLEpdbaMERGEPARTITIONSp11,p12INTOPARTITIONp13

分区表合并后,原分区表空间被释放,原数据均转移到新的表空间下。

现在查询新的分区表,数据应该为20w条。

Oracle PL/SQL

1

selectcount(*)frompdbapartition(p13)

结果如图:

2124db2ab6e4eed0a535250a04d27e37.png

分割分区表:

例子:将p13分区表分割成p11和p12分区表,即将11月和12月数据重新分割开。

Oracle PL/SQL

1

2

/*一个分区表分割成两个分区表*/

altertablepdbasplitPartitionp13at(to_date('2013-12-01','yyyy-mm-dd'))into(Partitionp11,Partitionp12);

过程和合并分区表下相反。

现在p11和p12表空间和数据重新恢复和添加。

11月和12月各10w条数据

更改分区表名:

Oracle PL/SQL

1

2

--更改分区表名

altertablepdbarenamePartitionp11top22;

增删查改分区表的数据:

操作与物理表几乎相同, 只是操作分区表时在分区表前加入 物理表名称即可。具体如下图:

Oracle PL/SQL

1

2

3

4

5

6

7

8

--查询分区表数据

selectDISTINCT*frompdbapartition(p12)

--修改分区表数据

updatepdbapartition(p12)psetp.time=to_date('2013-12-08','yyyy-mm-dd');

--增加分区表数据

insertintopdbapartition(p12)pVALUES(1,to_date('2013-12-29','yyyy-mm-dd'));

--删除分区表数据

deletefrompdbapartition(p12)twheret.id=1

七、附录:

显示分区表信息

显示数据库所有分区表的信息:DBA_PART_TABLES

显示当前用户可访问的所有分区表信息:ALL_PART_TABLES

显示当前用户所有分区表的信息:USER_PART_TABLES

显示表分区信息 显示数据库所有分区表的详细分区信息:DBA_TAB_PARTITIONS

显示当前用户可访问的所有分区表的详细分区信息:ALL_TAB_PARTITIONS

显示当前用户所有分区表的详细分区信息:USER_TAB_PARTITIONS

显示子分区信息 显示数据库所有组合分区表的子分区信息:DBA_TAB_SUBPARTITIONS

显示当前用户可访问的所有组合分区表的子分区信息:ALL_TAB_SUBPARTITIONS

显示当前用户所有组合分区表的子分区信息:USER_TAB_SUBPARTITIONS

显示分区列 显示数据库所有分区表的分区列信息:DBA_PART_KEY_COLUMNS

显示当前用户可访问的所有分区表的分区列信息:ALL_PART_KEY_COLUMNS

显示当前用户所有分区表的分区列信息:USER_PART_KEY_COLUMNS

显示子分区列 显示数据库所有分区表的子分区列信息:DBA_SUBPART_KEY_COLUMNS

显示当前用户可访问的所有分区表的子分区列信息:ALL_SUBPART_KEY_COLUMNS

显示当前用户所有分区表的子分区列信息:USER_SUBPART_KEY_COLUMNS

————————————————

转自:https://blog.csdn.net/rly101112/article/details/11682417

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐