目录

1.范围分区、散列分区、列表分区、复合分区。

2.11g新增的引用分区、间隔分区、基于虚拟列的分区、系统分区。


1.范围分区、散列分区、列表分区、复合分区。

允许用户将一个表分成多个区,用户可以执行查询时,只访问表中的特定分区;将不同的分区存储在不同的磁盘,提高访问性能和安全性;并且可以独立的备份和恢复每个分区;SQLSever2005有了分区表内容,但是建分区表时比较麻烦,Oracle建分区表相比比较简单。和索引相比都是为了提高查询速度,但是分区是物理上的,因为在做增删查改时,数据库会根据 where 后面的筛选条件来进行遍历,普通表遍历时会从零号数据块遍历到高水位线。但是有了表分区后,可以快速锁定数据内存的位置范围,在范围中进行遍历,大大加快了查询速度。

分区方法4种:

范围分区:表中的一列或者多列进行范围分区

create table student(
sno int,
entrance_date date,
sname varchar2(20)
)
partition by range(entrance_date)(partition s1 values less than (date'2015-7-1'),partition s2 values less than (date'2016-7-1'),partition s3 values less than (date'2017-7-1'),partition s4 values less than (date'2018-7-1')
);
insert into student values(1,date'2015-5-30','A');
insert into student values(2,date'2015-7-1','B');
insert into student values(3,date'2016-7-1','A');
insert into student values(4,date'2018-1-30','A');
--insert into student values(5,date'2019-5-30','A'); --汇报无法映射到任何分区的错误
commit;

按分区查找信息:

select * from student partition(s1) where sname='A';

查询分区信息:

select * from user_tab_partitions where table_name ='STUDENT';
在范围分区中,会根据某个字段(entrance_date)的值进行判断该放入哪一块分区中,s1分区为2015-7-1之前的,不包含当天,s2,从2015-7-1 当天 到2016-7-1 之前 ,超出分区范围的数据是没有办法插入的,要添加分区外的数据只能先添加分区。

alter table student add partition s5 values less than(maxvalue);
insert into student values(5,date'2019-5-30','A');

散列分区:当数据字段没有什么逻辑关系时,可以考虑散列分区。散列分区会把数据分散分配到各个区中,采用HASH函数决定了存储数据到哪块分区上。这样分区内的数据量就比较平均。hash分区的hash函数无法自定义,由Oracle 自动提供。

create table student_hash(
sno int,
entrance_date date,
sname varchar2(20)
)
partition by HASH(sno)(partition s1 ,partition s2
);
insert into student_hash values(1,date'2015-5-30','A');
insert into student_hash values(2,date'2015-7-1','B');
insert into student_hash values(3,date'2016-7-1','A');
insert into student_hash values(4,date'2018-1-30','A');
commit;

列表分区:

和范围分区类似,当字段的取值是一个范围时,可以采用范围分区;当字段的取值是个枚举时,可以采用列表分区。例如像所在省份 这样的字段,就相比范围分区更适合用列表分区。

create table student_list(
sno int,
entrance_date date,
address varchar2(20)
)
partition by LIST(address)(partition 东南沿海 values ('福建','广东','浙江'),partition 东北 values ('黑龙江','辽宁','吉林'),partition 西部 values ('西藏','新疆')
);
insert into student_list values(1,date'2015-5-30','福建');
insert into student_list values(2,date'2015-7-1','广东');
insert into student_list values(3,date'2016-7-1','西藏');
--insert into student_list values(4,date'2018-1-30','湖北');
commit;

同样的,插入不在分区范围的数据时,会报错。

复合分区:

就是范围分区和散列分区结合  或者 列表分区和散列分区相结合的分区。 此时的散列分区只能做范围分区和列表分区的子分区。

create table student_range_hash(
sno int,
entrance_date date,
address varchar2(20)
)
partition by range(entrance_date)
subpartition by hash(sno)   --子分区hash(sno)
subpartitions 4   --指明每个范围分区中有4个hash分区
(partition s1 values less than (date'2015-7-1'),partition s2 values less than (date'2016-7-1'),partition s3 values less than (date'2017-7-1'),partition s4 values less than (date'2018-7-1'),partition s5 values less than (maxvalue)
);

查看分区信息 和查看子分区信息:

select * from user_tab_partitions where table_name ='STUDENT_RANGE_HASH';
select * from user_tab_subpartitions where table_name ='STUDENT_RANGE_HASH';

2.11g新增的引用分区、间隔分区、基于虚拟列的分区、系统分区。

引用分区:一定要有个主键和外键之间的关系。外键表可以继承父表的分区方式,而不用自己新建。

----------创建主表--------
create table student_hash(
sno int primary key,
entrance_date date,
sname varchar2(20)
)
partition by HASH(sno)(partition s1 ,partition s2
);
insert into student_hash values(1,date'2015-5-30','A');
insert into student_hash values(2,date'2015-7-1','B');
insert into student_hash values(3,date'2016-7-1','A');
insert into student_hash values(4,date'2018-1-30','A');
commit;
----------副表创建 (设立主键,设立外键)---------
create table score_pointer(
exam_id int primary key,
sno int not null,
score int,
constraint fk_score foreign key(sno) references student_hash(sno)
)
partition by reference(fk_score);   ---引用分区关联外键

select * from user_tab_partitions where table_name ='STUDENT_HASH' or table_name ='SCORE_POINTER';

在引用分区中,副表的分区字段属性和主表的分区字段的属性一样。主表用了散列分区,那么副表就用散列分区,使用的hash函数和主表是一致的;如果主要用了范围分区,那么分区的类型和分区的取值范围主表和副表都是一致的。

间隔分区:

完全自动根据 间隔阈值 来创建范围分区。是范围分区的扩展。间隔分区属于范围分区。在范围分区中,当每次输入的值超出分区范围时,就会报错,而间隔分区会新建分区自动扩展 可输入的范围。自动扩展多大呢?自动扩展的大小就是间隔阈值。

create table student(
sno int,
entrance_date date,
sname varchar2(20)
)
partition by range(entrance_date)
interval ( numtoyminterval(1,'MONTH') ) --每超出最大范围一个月自动创建一个分区。
(partition s1 values less than (date'2015-7-1'),   -----初始化分区partition s2 values less than (date'2016-7-1'), partition s3 values less than (date'2017-7-1'),partition s4 values less than (date'2018-7-1')
);
insert into student values(1,date'2015-5-30','A');
insert into student values(2,date'2015-7-1','B');
insert into student values(3,date'2016-7-1','A');
insert into student values(4,date'2018-1-30','A');
insert into student values(5,date'2019-5-30','A');
insert into student values(5,date'2021-5-30','A');
commit;

select * from user_tab_partitions where table_name ='STUDENT'

刚开始初始化了4个分区,当插入entrance_date=date'2019-5-30'时就会创建一个从 2019-5-1 到2019-6-1的分区;当插入entrance_date=date'2021-5-30'时就会创建一个从 2021-5-1 到2021-6-1的分区,。分区范围为分区阈值所指定的1个月。从初始化的分区范围最大值2018-7-1开始分,连续一个月一个月的加。

基于虚拟列的分区:范围分区、散列分区、列表分区等可以作用在虚拟列上的。分区原理和传统分区没区别。

create table score(
exam_id int primary key,
sno int not null,
score int,
score_percent as (score /150.0 * 100.0) virtual   ---指明虚拟列
)
partition by HASH(score_percent)(partition s1 ,partition s2
);

系统分区:不需要指定分区列,不需要范围等,只需要指定分区的个数就行,一切分区的控制和管理由Oracle来完成。

create table score2(
exam_id int primary key,
sno int not null,
score int,
score_percent as (score /150.0 * 100.0) virtual
)
partition by system(partition s1 ,partition s2
);

操作分区时,和查找普通表是完全相同,Oracle会自动把数据保存到对应的分区上,删除的时候也会自动地找到相应的分区把数据删除。增删查改语句时可以 显示指定要操作的分区。

添加/删除/截断分区:

ALTER TABLE [tablename]   ADD /DROP /TRUNCATE     PARTITION  [partitionName] ;

合并分区:在分区相邻的情况下可以进行分区合并:

ALTER TABLE [tablename]  MERGE PARTITIONS [分区名1],[分区名2]  INTO PARTITION [新分区名];

拆分分区: 适用于分区类型为范围分区的拆分。

ALTER TABLE [tablename]  SPLIT PARTITION [分区名]

AT(拆分的临界点)

INTO  (   PARTITION [新分区名1]  , PARTITION [新分区名2] );

Oracle原理:表分区相关推荐

  1. oracle 表删掉了_分区,Oracle 删除表分区

    Oracle 删除表分区 删除表分区 作者: 来源: 发布日期:2008-05-23 删除表分区(drop partition) 删除表分区包含两种操作,分别是: Ø 删除分区:alter table ...

  2. Oracle 的表分区详解

    --本文转自https://www.cnblogs.com/leiOOlei/archive/2012/06/08/2541306.html 从以下几个方面来整理关于分区表的概念及操作: 表空间及分区 ...

  3. Oracle增加表分区

    Oracle增加表分区 一.首先我们讲一下表分区的优缺点 表分区有以下优点: 1.改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度. 2.增强可用性:如果表的某个分区出现故障,表在 ...

  4. Oracle 删除表分区

    Oracle 删除表分区 删除表分区(drop partition) 删除表分区包含两种操作,分别是: Ø 删除分区:alter table [tbname] drop partition [ptna ...

  5. Oracle之表分区、分区索引(二)

    其实range分区你学会了,其他的分区你也学会了,在这我就不敲了,咱们简单来看一下,hash分区,hash分区实现负载均衡,平均分配值进行分区,那这个哈希就是平均分配的,也是一张表,还是partiti ...

  6. Oracle之表分区、分区索引(一)

    继续往下讲就是分区了 对于ORACLE来讲,分区是咱们开发中最常用的,什么样的场景下要进行分区,主要是针对于大数据量的表,频繁查询的表,我只是说数据量大的表,并没有说物理的这个大,比如你搞一个文件表, ...

  7. ORACLE 创建表分区

    原文:https://www.cnblogs.com/yuxiaole/p/9809294.html oracle 11g 支持自动分区,不过得在创建表时就设置好分区. 如果已经存在的表需要改分区表, ...

  8. oracle 创建范围分区表,Oracle创建表分区----范围分区

    创建分区是数据库优化的一种手段,范围分区是表分区的一种. 创建范围分区的关键字是"RANGE",创建该分区后,其中的数据可以根据分区键值指定的范围进行分布,当数据在范围内均匀分布时 ...

  9. oracle删表分区同时维护索引,有关Oracle表分区进行(DML)维护后对索引的影响的分析...

    对索引的几种情况分别进行总结:1.如果删除分区,则会导致该表下所有的索引状态处于不可用状态(除本地前缀索引外):2.如果重命名表,同上3.如果truncate分区数据,同上:4.重命名分区,不会对索引 ...

最新文章

  1. 人工智能,能治工人!
  2. 在Mac终端下使用conda命令提示未找到命令conda
  3. armbian安装图形桌面_Linux图形界面的搜索工具,比Windows强吗?
  4. C#数据结构-单链表
  5. eventsource前台怎么接收一个对象数据_Java开发经验总结篇(1)——数据保存的整洁方法...
  6. Redis教程:数据库
  7. java win8 mac地址_Win8系统查看mac地址的两种方法
  8. 非参数统计的Python实现—— Friedman 秩方差分析
  9. 计算机的基本数据结构与算法分析,数据结构与算法分析
  10. Hybrid App实现原理
  11. 用计算机新字库打出的文字,为什么用五笔打字有很多字打不出来(GBK和GB2312字库的区别)...
  12. android 补间动画停止,Android动画原理分析(一)---补间动画
  13. 计算机机械硬盘寿命,机械硬盘的寿命
  14. InstallShield Slient Uninstall
  15. 随时标注各种物件,一个小标签机就能搞定,汉印M11体验
  16. android图片显示组件,Android可循环显示图像的Android Gallery组件用法实例
  17. ubuntu18使用问题记录1: 解决 ubuntu 开机后键盘鼠标失灵!
  18. 运城学院计算机课,主讲教师
  19. 图像相似度匹配——距离大全
  20. 【幺幺肆】低成本自制BT/PT下载用数据服务器(肆某带你自制NAS)--第一部分--前期准备

热门文章

  1. JavaScript(JS)之简单介绍
  2. 单点登录之实战CAS5.1.x(六)——REST协议
  3. ORA-04031错误导致宕机案例分析
  4. linux下find查找带有指定权限的文件(windows下编译的源代码文件)
  5. 2013第51周二eclipse启动优化
  6. 缓存nginx服务器的静态文件
  7. 查看域名真实IP地址NSlookup命令使用浅析
  8. flex vue 垂直居中居上_移动开发-flex 布局
  9. 如何实现自由复制知乎文章?【1分钟掌握】
  10. 在Centos下安装Typora