写在前面:
段的类型(表空间,段,区,块的关系)
表一般是
堆表,在没有素引的情况下,寻找空闲空间是随机的,寻找记录默以全表扫
分区表比如一个表尺寸大于2G, oracle建议分区分区。一个分区内的数据量一般不超过50W左右性能最好,最多也不要超过100万
range分区方式,也算是最常用的分区方式,其通过某宇段或几个空段的组合的值,从小到大,桉照指定的范围说明进行分区,我们在INSERT数据的时候就存储到指定的分区中
比如按时间分区或值的大小分区
List分区方式,一般是在 rangc基础上做的二级分区较多,是一种列举方式进分区,一般讲
某些地区、状态或指定规则的编码等进行划分
Hash分区方式,它没有固定的规则,+ ORACLE管理,只需要将值INSERT进去,RACLE会自动去根据一套HASH算法去划分分区,只需要告诈 ORACLE要分几个区即可。我主写分区表
I 分区表的概述:
Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。
分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。每个分区有自己的名称,还可以选择自己的存储特性。从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。
1、分区表的优点:
(1)由于将数据分散到各个分区中,减少了数据损坏的可能性;
(2)可以对单独的分区进行备份和恢复;
(3)可以将分区映射到不同的物理磁盘上,来分散IO;
(4)提高可管理性、可用性和性能。
2、什么时候用分区表
(1) 单表过大,超过一定范围,建议以g计算表,均可考虑用分区
(2)历史数据据需要剥离的
(3)查询特征非常明显,比如是按整年、整月或者按某个范围!
3、分区表的类型
1、range分区,按范围
2、list分区,列举分区
3、hash分区,根据hash值进行的散列分区
4、复合分区,9i开始,Oracle就包括了2种复合分区,RANGE-HASH和RANGE-LIST。在11g,Oracle一下就提供了4种复合分区:RANGE-RANGE、LIST-RANGE、LIST-HASH和LIST-LIST。
II 创建分区的举例
11g自动分区技术
CREATE TABLE auto_partition (
OBJECT_ID NUMBER,
OBJECT_TYPE VARCHAR2(128),
CREATED DATE)
PARTITION BY RANGE (CREATED)
INTERVAL(NUMTOYMINTERVAL(1, 'month'))
(PARTITION P0 VALUES LESS THAN (TO_DATE('1-1-2011', 'dd-mm-yyyy')));
--按年创建
create table test_jia
(
ID NUMBER(20) not null,
REMARK VARCHAR2(1000)
)
PARTITION BY RANGE (CREATE_TIME) INTERVAL (numtoyminterval(1, 'year'))
(partition part_t01 values less than(to_date('2020-01-01', 'yyyy-mm-dd')));
这样,就会每个年系统自动生成一个分区
--INTERVAL (NUMTODSINTERVAL(1,'day')) 表示每天
--INTERVAL (NUMTOYMINTERVAL(1,'mouth')) 表示每月
--INTERVAL (NUMTODSINTERVAL(7,'day')) 表示每周
III分区操作
--添加分区
添加分区
alter table test_jia add partition P3 valuse less than (to_date('2020-01-10','YYYY-MM-DD'));
--删除分区
删除分区
alter table test_jia drop partition P3;
说明,如果表只剩下一个分区了,则不能drop,而应该drop表。在复合分区中,如果一个分区只剩下一个子分区,也不能drop
--truncate 分区
truncate分区
alter table test_jia truncate partition P4;
--合并分区
alter table test_jia merge partition P1,P2 into partition P2;
注意:不能将分区合并到界限较低的分区。以上代码实现了P1 P2分区的合并
--拆分分区
alter table test_jia split partition P2 at(to_date('2013-02-01','YYYY-MM-DD')) into (partition P21,partition P22);
--重命名分区
alter table test_jia RENAME partition P21 to P2;
--分区表的查询
SQL> select * from test_jia partition(p1);
no rows selected
--创建分区表索引
create index ind_id on test_jia(id) local;
--分区表索引重建
alter index ind_test_jia rebuild partition p1 ;