柯南君 :Oracle 分区技术 之 如何支撑大数据操作?
前段时间,看了罗女士( 资深技术顾问 - Oracle 中国 顾问咨询部)关于《大批量数据处理技术的演讲》视频,感觉受益良多,结合多年的知识积累,柯南君给大家分享一下:
交流内容:
一、Oracle的分区技术
(一)分区技术内容
1. 什么是分区?
分区就是将一个非常大的table或者index 按照某一列的值,分解为更小的,易于管理的逻辑片段---分区。将表或者索引分区不会影响SQL语句以及DML(见备注)语句,就和使用非分区表一样,每个分区拥有自己的segment(见备注),因为,DDL(见备注)能够将比较大的任务分解为更小的颗粒。分区表只有定义信息,只有每个存放数据的分区才有各自的segment。就好象拥有多个相同列名,列类型的一个大的视图。
- 大数据对象(表,索引)被分成小物理段;
- 当分区表建立时,记录基于分区字段值被存储到相应的分区;
- 分区字段值可以修改(row movement enable);
- 分区可以存储在不同的表空间;
- 分区可以有不同的物理存储参数;
- 分区可以支持IOT表,对象表,LOB字段,varrays等;
① DML(data manipulation language):
它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言;
段(segment)是一种在数据库中消耗物理存储空间的任何实体(一个段可能存在于多个数据文件中,因为物理的数据文件
是组成逻辑表空间的基本物理存储单位)
2.分区的好处?
- 性能
- 并行DML操作
- Patition - wise Join
- 可管理性:数据删除,数据备份
- 提高备份性能
- 指定分区的数据维护操作
- 可用性
- 缩短恢复时间
- 分区目标优先级
③ 如何实施分区?
A . Range Partitioning(范围分区)
【案例分析】:
就是根据数据库表中某一字段的值的范围来划分分区,例如:
- create table graderecord
- (
- sno varchar2(10),
- sname varchar2(20),
- dormitory varchar2(3),
- grade int
- )
- partition by range(grade)
- (
- partition bujige values less than(60), --不及格
- partition jige values less than(85), --及格
- partition youxiu values less than(maxvalue) --优秀
- )
-
备注:
① 分区字段:grade
② values less than 必须是确定值
③ 每个分区可以单独指定物理属性 例如:partition bujige values less than(60) tablespace data0
④ 说明:数据中有空值,Oracle机制会自动将其规划到maxvalue的分区中。
1)插入实验数据:
- insert into graderecord values('511601','魁','229',92);
- insert into graderecord values('511602','凯','229',62);
- insert into graderecord values('511603','东','229',26);
- insert into graderecord values('511604','亮','228',77);
- insert into graderecord values('511605','敬','228',47);
- insert into graderecord(sno,sname,dormitory) values('511606','峰','228');
- insert into graderecord values('511607','明','240',90);
- insert into graderecord values('511608','楠','240',100);
- insert into graderecord values('511609','涛','240',67);
- insert into graderecord values('511610','博','240',75);
- insert into graderecord values('511611','铮','240',60);
2)下面查询一下全部数据,然后查询各个分区数据,代码一起写:
- select * from graderecord;
- select * from graderecord partition(bujige);
- select * from graderecord partition(jige);
- select * from graderecord partition(youxiu);
全部数据如下:
不及格数据如下:
及格数据如下:
优秀数据如下:
【范围分区特点】:
① 最早、最经典的分区算法
② Range分区通过对分区字段值的范围进行分区
③ Range分区特别适合于按时间周期进行数据的存储。日、周、月、年等。
④ 数据管理能力强
⑤ 数据迁移
⑥ 数据备份
⑦ 数据交换
⑧ 范围分区的数据可能不均匀
⑨ 范围分区与记录值相关,实施难度和可维护性相对较差
B.hash (散列分区)
【案例分析】:
散列分区是根据字段的hash值进行均匀分布,尽可能的实现各分区所散列的数据相等。
还是刚才那个表,只不过把范围分区改换为散列分区,语法如下(删除表之后重建):
- create table graderecord
- (
- sno varchar2(10),
- sname varchar2(20),
- dormitory varchar2(3),
- grade int
- )
- partition by hash(sno)
- (
- partition p1,
- partition p2,
- partition p3
- );
备注:
① 说明:散列分区即为哈希分区,Oracle采用哈希码技术分区,具体分区如何由Oracle说的算,也可能我下一次搜索就不是这个数据了。
1) 插入实验数据,与范围分区实验插入的数据相同。
然后查询分区数据:
- select * from graderecord partition(p1);
- select * from graderecord partition(p2);
- select * from graderecord partition(p3);
p1分区的数据:
p2分区的数据:
p3分区的数据:
【HASH分区特点】:
【案例分析】:
列表分区明确指定了根据某字段的某个具体值进行分区,而不是像范围分区那样根据字段的值范围来划分的。
- create table graderecord
- (
- sno varchar2(10),
- sname varchar2(20),
- dormitory varchar2(3),
- grade int
- )
- partition by list(dormitory)
- (
- partition d229 values('229'),
- partition d228 values('228'),
- partition d240 values('240')
- )
以上根据宿舍来进行列表分区,插入与范围分区实验相同的数据,做查询如下:
- select * from graderecord partition(d229);
- select * from graderecord partition(d228);
- select * from graderecord partition(d240);
d229分区所得数据如下:
d228分区所得数据如下:
d240分区所得数据如下:
【列表分区特点】:
首先讲范围-散列分区。先声明一下:列表分区不支持多列,但是范围分区和哈希分区支持多列。
代码如下:
-
柯南君 :Oracle 分区技术 之 如何支撑大数据操作?
-
打酱油 -
震惊 -
呵呵 -
赞 -
鄙视

- 不吐不快,赶紧来一发!
- 浅谈:架构师眼中的MySQL开发模式
- 思考mysql内核之初级系列5---information_schema不是innodb数据字典
- MySQL数据库存储引擎详解
- 运行多个MYSQL服务器
- mysql内核之初级系列3-办理业务的流程
- MySQL 句柄数占用过多的解决方法
- mysql中utf8编码的utf8_bin,utf8_general_cs,utf8_bin的区别
- MySql的count(*)统计结果很慢?为什么
- mysql中,主键与普通索引的区别是什么?
- 详解:mysql MyISAM InnoDB 两者之间的区别

- 新闻APP后端系统架构成长之路 - 高可用架构设计
- PHP基础: CLI模式开发不需要任何一种Web服务器
- 基础教程:svn命令在linux下的使用
- 亿级Web系统搭建——单机到分布式集群
- HTTP简介,http是一个属于应用层的面向对象的协议
- Serverless技术架构,传说中的FAAS(Function as a Service),极简运维,无限扩容
- PHP漏洞全解(六)跨网站请求伪造
- php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
- PHP学习路线以及10个PHP优化技巧
- 适用于PHP初学者的学习线路和建议
- 2016PHP技术盛会:如何编写可测试的代码
- MySQL改密码报错:ERROR 1045: Access denied for user: 'root@localhost' (Using password: YES)
- phpmyadmin导入导出数据库文件最大限制的解决方法
- Linux环境下MySQL数据库大小写区分问题
- php 5.4中php-fpm 的重启、终止操作命令
- Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用
- Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作
- Key/Value之王Memcached初探:一、掀起Memcached的盖头来
- NoSQL初探之人人都爱Redis:(4)Redis主从复制架构初步探索
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例