刚从厦门回来,还没缓过来。。。。。废话不多说,先介绍简单一些定义,以下是我copy某位博主的。
一、Oracle数据库表分区概念和理解
1.1、已经存在的表没有方法可以直接转化为分区表。
1.2、不在分区字段上建立分区索引,在别的字段上建立索引相当于全局索引。效率低。
1.3、表空间概念:
表空间指的是是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间。
1.4、分区表概念
当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。
二、Oracle数据库表分区的几种类型
2.1、范围分区(Range分区)
范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期
1)每一个分区都必须有一个VALUES LESS THEN子句,它指定了一个不包括在该分区中的上限值。分区键的任何值等于或者大于这个上限值的记录都会被加入到下一个高一些的分区中。
2) 所有分区,除了第一个,都会有一个隐式的下限值,这个值就是此分区的前一个分区的上限值。
3) 在最高的分区中,MAXVALUE被定义。MAXVALUE代表了一个不确定的值。这个值高于其它分区中的任何分区键的值,也可以理解为高于任何分区中指定的VALUE LESS THEN的值,同时包括空值。
什么时候使用分区表:
表的大小超过2GB。
表中包含历史数据,新的数据被增加都新的分区中。
表分区有以下优点:
改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。
缺点:
已经存在的表没有方法可以直接转化为分区表。但是有几种方式可以间接完成这个操作,大家可以参考:oracle分区表的建立方法(包含已经存在的表要分区):http://blog.csdn.net/wanglilin/article/details/7177338
直接上手。
首先,表的设计,要想表分区,其实就要在表设计的同时,定义好分区的区间。
例1.以时间分区:
CREATE TABLE fenbiao_test
(
ORDER_ID NUMBER(7) NOT NULL,
ORDER_DATE DATE,
TOTAL_AMOUNT NUMBER,
CUSTOTMER_ID NUMBER(7),
PAID CHAR(1)
)
partition by range(ORDER_DATE)(
partition fenbiao_test_part1 values less than (to_date('2019-04-01','yyyy-mm-dd')),
partition fenbiao_test_part2 values less than (to_date('2019-05-01','yyyy-mm-dd')),
partition fenbiao_test_part3 values less than (to_date('2019-06-01','yyyy-mm-dd'))
);
--插入数据
insert into fenbiao_test
(ORDER_ID, ORDER_DATE, TOTAL_AMOUNT, CUSTOTMER_ID, PAID)
values
(11, to_date('2018-11-22', 'yyyy-mm-dd'), 1, 24, '5');
insert into fenbiao_test
(ORDER_ID, ORDER_DATE, TOTAL_AMOUNT, CUSTOTMER_ID, PAID)
values
(12, to_date('2019-01-28', 'yyyy-mm-dd'), 1, 29, '5');
insert into fenbiao_test
(ORDER_ID, ORDER_DATE, TOTAL_AMOUNT, CUSTOTMER_ID, PAID)
values
(13, to_date('2019-02-26', 'yyyy-mm-dd'), 1, 33, '5');
insert into fenbiao_test
(ORDER_ID, ORDER_DATE, TOTAL_AMOUNT, CUSTOTMER_ID, PAID)
values
(14, to_date('2019-04-22', 'yyyy-mm-dd'), 2, 79, '6');
insert into fenbiao_test
(ORDER_ID, ORDER_DATE, TOTAL_AMOUNT, CUSTOTMER_ID, PAID)
values
(15, to_date('2019-05-29', 'yyyy-mm-dd'), 3, 88, '7');
--查看所有的数据
select * from fenbiao_test;
--常用的分区操作sql
--显示数据库所有分区表的信息:
select * from DBA_PART_TABLES
--显示当前用户可访问的所有分区表信息:
select * from ALL_PART_TABLES
--显示当前用户所有分区表的信息:
select * from USER_PART_TABLES
--显示表分区信息 显示数据库所有分区表的详细分区信息:
select * from DBA_TAB_PARTITIONS
--显示当前用户可访问的所有分区表的详细分区信息:
select * from ALL_TAB_PARTITIONS
--显示当前用户所有分区表的详细分区信息:
select * from USER_TAB_PARTITIONS
--显示子分区信息 显示数据库所有组合分区表的子分区信息:
select * from DBA_TAB_SUBPARTITIONS
--查询表上有多少分区(注意 table_name 后的表名必须大写)
SELECT * FROM useR_TAB_PARTITIONS WHERE TABLE_NAME='FENBIAO_TEST';
--查询表分区中的数据量
select count(*) from FENBIAO_TEST PARTITION (fenbiao_test_part1);
--查询表分区中的数据
select * from FENBIAO_TEST PARTITION (fenbiao_test_part1);
例2.