前段时间,看了罗女士( 资深技术顾问 -
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(data
manipulation language):
段(segment)是一种在数据库中消耗物理存储空间的任何实体(一个段可能存在于多个数据文件中,因为物理的数据文件
是组成逻辑表空间的基本物理存储单位)
2.分区的好处?
- Select 和 DML操作只访问指定分区
- 并行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分区特点】:
?基于分区字段的HASH值,自动将记录插入到指定分区。
?分区数一般是2的幂
?易于实施
?总体性能最佳
?适合于静态数据
?HASH分区适合于数据的均匀存储
?HASH分区特别适合于PDML和partition-wise joins。
?支持 (hash) local indexes
?9i不支持 (hash)global indexes
?10g 支持(hash)global indexes HASH分区
?数据管理能力弱
?HASH分区对数据值无法控制
c.列表分区
【案例分析】:
列表分区明确指定了根据某字段的某个具体值进行分区,而不是像范围分区那样根据字段的值范围来划分的。
-
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分区所得数据如下:
【列表分区特点】:
?List分区通过对分区字段的离散值进行分区。
?List分区是不排序的,而且分区之间没有关联关系
?List分区适合于对数据离散值进行控制。
?List分区只支持单个字段。
?List分区具有与范围分区相似的优缺点
–数据管理能力强
–List分区的数据可能不均匀
–List分区与记录值相关,实施难度和可维护性相对较差
d.组合分区(范围-散列分区,范围-列表分区)
【案例分析】:
首先讲范围-散列分区。先声明一下:列表分区不支持多列,但是范围分区和哈希分区支持多列。
代码如下:
-
var cpro_id = "u6885494";
推荐阅读
-
本文深入探讨了大数据SQL优化中的数据倾斜问题,提供了多种解决策略和实际案例,旨在帮助读者理解和应对这一常见挑战。 ...
[详细]
蜡笔小新 2024-11-29 13:37:00
-
介绍自2007年以来,亚马逊已售出数千万台Kindle,令人印象深刻。但这也意味着数以千万计的人可能会因为这些Kindle中的软件漏洞而被黑客入侵。他 ...
[详细]
蜡笔小新 2024-11-29 07:58:24
-
-
重构的流程重构手法 正如上一次所讲的那样,重构有两个基本条件,一是要保持代码在重构前后的行为基本不变,二是整个过程是受控且尽可能少地产生错误。尤其是对于第二点,产生了一系列的重构手 ...
[详细]
蜡笔小新 2024-11-29 22:26:21
-
ANSI最全介绍linux终端字体改变颜色等ANSI转义序列维基百科,自由的百科全书由于国内不能访问wiki而且国内关于ANSI的介绍都是简短的不能达到,不够完整所以转wiki到此 ...
[详细]
蜡笔小新 2024-11-29 12:47:14
-
本文探讨了Thrift作为一款支持多语言的服务开发框架,其在体积、功能、扩展性以及多协议支持等方面的显著优势。特别地,Thrift作为一种RPC(远程过程调用协议)框架,非常适合用于构建可扩展且低耦合的分布式服务系统。文章通过多种编程语言对Thrift服务进行了性能测试,并提供了详细的测试结果。 ...
[详细]
蜡笔小新 2024-11-29 10:44:30
-
通过学习《Think Python》,我对Python编程有了初步了解,但在使用第三方库方面仍感到陌生。近期因百度空间即将关闭,我打算利用Evi1m0提供的Python爬虫代码备份个人网站,过程中遇到了第三方库安装的问题。 ...
[详细]
蜡笔小新 2024-11-29 10:08:32
-
在微服务实施过程中,确定合理的代码结构至关重要。本文探讨了如何利用领域驱动设计(DDD)的分层架构来优化微服务的代码模型,确保系统的可维护性和扩展性。 ...
[详细]
蜡笔小新 2024-11-29 01:22:32
-
本文详细介绍了快速排序算法的工作原理和实现步骤,包括选择基准值、分区过程以及递归调用等关键环节。通过具体的Java代码示例,帮助读者更好地理解和掌握这一高效的排序算法。 ...
[详细]
蜡笔小新 2024-11-28 18:26:54
-
本文总结了几个常用的Android开发技巧,包括检测设备上是否安装特定应用、获取应用的版本名称、设置状态栏透明以及如何从一个应用跳转至另一个应用的方法。 ...
[详细]
蜡笔小新 2024-11-28 17:32:27
-
本文详细介绍了MySQL表分区的概念、类型及其在实际应用中的实施方法,特别是针对Zabbix数据库的优化策略。 ...
[详细]
蜡笔小新 2024-11-28 16:38:55
-
En-Tan-Mo再次引领创新潮流,推出全新'大众奖励计划'。作为区块链领域的先锋,En-Tan-Mo继交易所上线、发布技术白皮书及共识之夜活动后,再次展现其团队的卓越与活力。本文将详细介绍该计划的具体内容及其对参与者的重要意义。 ...
[详细]
蜡笔小新 2024-11-28 16:36:13
-
本文介绍如何使用Java实现AC自动机(Aho-Corasick算法),以实现高效的多模式字符串匹配。文章涵盖了Trie树和KMP算法的基础知识,并提供了一个详细的代码示例,包括构建Trie树、设置失败指针以及执行搜索的过程。 ...
[详细]
蜡笔小新 2024-11-28 14:52:17
-
本文通过个人经历引出关于数学教学中的一个常见误解——被零除的结果,并深入探讨了浮点数中负零的存在及其背后的数学原理。 ...
[详细]
蜡笔小新 2024-11-28 13:56:40
-
本文详细解析了LeetCode第300题——最长递增子序列的解题方法,特别是如何使用动态规划来高效解决问题。文章不仅提供了详细的代码实现,还探讨了常见的错误理解和正确的解题思路。 ...
[详细]
蜡笔小新 2024-11-28 13:14:06
-
第三周课堂测试1、使用汇编语言编写指令时,用一些简单的容易记忆的符号来代替二进制指令,比机器语言更为方便,属于高级语言。(B ...
[详细]
蜡笔小新 2024-11-28 13:02:41
-