hash的原理虽然简单,但是它在数据库中可以说是无处不在。其中hash partition是hash在数据库中一个简单的应用,虽然它没有range partition那么常用,但是我们在做数据库水平拆分时,其实就是利用了hash partition的原理,利用hash函数对某个key进行运算,然后将其分布到不同的主机上,原理很简单。

我们在设计时遇到了一个问题,当分区的数量需要变化时,基于hash的原理,数据可能会从一个分区移动到另外一个分区,因为某个key在4个分区时,可能被分布在分区3,而在8个分区时,可能被分布在分区5。这样每当分区数量变化时,就需要全部重新分布数据,代价很高。

那么Oracle是怎么做的?首先可以肯定的是Oracle的hash partition在分区增加时,不需要做全部数据的重新分布。有人告诉我Oracle的hash函数比较牛,可以保证分区数量增加时,这个hash函数可以让原来的数据还在旧的分区中,而新的数据可以分布在新的分区。Oracle的函数无非就是get_hash_value或ora_hash(10g),从hash的原理上来说,这也是不可能做到的。

我们对hash partition都有一个常识,就是partition的数量最好是2的次方,也就是2,4,8,16……,否则分区会出现不分区均衡的现象,按照hash的原理,不管是几个分区,都可以做到完全均衡的,为什么会不均衡,其实答案已经出来了,Oracle为了能够增加分区,为你预留了几个看不到的分区。

假设我们有6个分区,一共8000条数据,数据的分布如下图:

hash partition不能直接增加分区,而是split当前分区,当需要增加到8个分区时,实际上是分区3和分区4分别split产生新的分区7和分区8,如下图:

Oracle如何做到分区数量增加后,其他分区的数据不受影响呢,其实很简单,Oracle在做hash运算时,预留了分区,比如6个分区,实际上是用8个分区的hash来运算的,只不过把缺少的分区的数据合并到其他分区,这样就会出现数据不均衡的情况。Oracle的公式是这样的,用等于或者大于当前分区数量的最小的一个2的N次方,比如6个分区做8个hash bucket。我们再来考虑一下2,4,8,16(2的N次方)的情况,比如要把4个分区加为5个分区,因为已经是2的N次方,所以数据会均匀分布,而且Oracle还是使用4个hash bucket。这时新增的分区5实际上把分区1 split后产生的,这时因为有5个分区了,所以会使用8个hash bucket。这时Oracle的hash函数就比较牛了,它可以保证2,4,8,16个分区时,同一个键值分布在相同的分区或者是对应可以合并的分区,看下面的SQL:

select ora_hash(’hellodba’,1)+1 par2,ora_hash(’hellodba’,3)+1 par4,ora_hash(’hellodba’,7)+1 par8,ora_hash(’hellodba’,15)+1 par16 from dual;

PAR2 PAR4 PAR8 PAR16

---------- ---------- ---------- ----------

2 4 4 12上面的SQL我们看到分区的数量在2,4,8,16时,hellodba这个key分别落在在2,4,4,12号分区,虽然落在不同的分区上,但是分区4和分区12是对应可合并的,这样就保证了数据是不需要移动的。一句话总结就是hash bucket总是2的N次方,如果分区数不足,则会合并数据,产生不均衡的情况,这样增加分区时,只需要对应分区的数据做split即可。同理,减少分区也不是简单的drop,而是合并分区。

再回到我们的项目中,我们为了解决这个问题,采用了更简单的处理方案,直接就做了1024个分区,我们有8个物理数据库,每个数据库中有128个表,以后再分拆时,只要移动这些表,并修改应用中的对应关系就可以了。其实和Oracle合并再拆分的思路是一样的。

标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,尊重他人劳动成果

文章转载自:网络转载

0

好文不易,鼓励一下吧!

oracle拆分分区语法详解大全_Oracle hash的分区方法详解相关推荐

  1. oracle拆分分区语法详解大全_oracle拆分分区表及重建索引

    分区表的好处,应该就是提高性能. 提高性能的套路,一般就是垂直扩展和水平扩展.垂直扩展就是换更强的服务器,水平扩展就是加更多的服务器.垂直扩展适合单机版,水平扩展常用于分布式系统.而传统的数据库,如o ...

  2. oracle拆分分区语法详解大全_学习笔记:Oracle分区表 添加 删除 合并 删除 交换 拆分等分区表的操作案例...

    天萃荷净 Oracle分区表管理,记录关于Oracle分区表的管理案例:创建.删除.合并.拆分.交换.更改分区表的操作方法 1.添加创建分区表 1.1)增加分区(add partition) 语法是: ...

  3. oracle中dual最多存多大_ORACLE中dual用法详解

    基本上oracle引入dual为的就是符合语法 1. 我们先从名称来说,dual不是缩写词,本身就是完整的单词.dual名词意思是对数,做形容词时是指二重的,二元的. 2. Oracle中的dual表 ...

  4. oracle添加分区语句_Oracle分区详解和创建

    Oracle分区详解和创建 Oracle在实际业务生产环境中,经常会遇到随着业务量的逐渐增加,表中的数据行数的增多,Oracle对表的管理和性能的影响也随之增大.对表中数据的查询.表的备份的时间将大大 ...

  5. Oracle 表分区详解(partition table)

    文章目录 1 概述 1.1 思维导图 2 分类 2.1 传统表分区 2.1.1 范围分区 range 2.1.2 列表分区 list 2.1.3 哈希分区 hash 2.1.4 复合分区 range ...

  6. oracle 表分区详解

    目录 一.概念 二.类型及操作方法 1. 范围分区 range -最常用 2. 列表分区 list 3. 散列分区 hash 4. 组合分区 a. 范围-列表分区 b. 范围-散列分区 三.表分区的查 ...

  7. oracle表分区详解

    此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念 2.表分区的具体作用 3.表分区的优缺点 4.表分区的几种类型及操作方法 5.对表分区的维护性操作. (1.) 表空间及分区 ...

  8. oracle list 分区详解,oracle的List分区及分区索引

    最近在做的一个项目,由于涉及到数据量会在半年内破千万条,考虑到数据量比较大,日后查询起来会比较费时,所以考虑使用oracle的分区特性.oracle10g产品中的分区表分为List,hash,rang ...

  9. (转)oracle表分区详解

    此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念 2.表分区的具体作用 3.表分区的优缺点 4.表分区的几种类型及操作方法 5.对表分区的维护性操作. (1.) 表空间及分区 ...

最新文章

  1. 谷歌砸出10亿美元,要为湾区困难群众,建2万套经适房
  2. Intel Hex格式说明
  3. FFmpeg再学习 -- Windows下安装说明
  4. 什么是 JavaScript 世界的 UMD
  5. vue打包后不使用服务器直接访问方法
  6. 逻辑回归算法_算法逻辑回归
  7. linux tomcat php配置文件在哪个文件夹下,tomcat下,怎么安配备置php ?(linux系统)
  8. 链接列表插入删除方法
  9. Scikit-learn数据变换
  10. mysql全库备份/增量备份脚本
  11. Python实现简单人脸识别
  12. ext2文件系统源代码之balloc.c文件解析
  13. 海思OSD开发系列(一) SDL_TTF框架移植
  14. java+selenum实现网页自动化总结
  15. 围绕开源的系列思考之二——企业篇
  16. Hive创建表的过程详细过程
  17. win10 任务栏的工具栏 以及重启消失的解决方法
  18. JS实现字符串模糊匹配
  19. PHP_保留两位小数并且四舍五入(可用于精度计算)_保留两位小数并且不四舍五入,
  20. 【GPS仿真】基于matlab GPS信号捕获跟踪定位仿真【含Matlab源码 1960期】

热门文章

  1. Jexus 5.8.2 正式发布为Asp.Net Core进入生产环境提供平台支持
  2. 【直播预告】创享未来 2016微软开发者峰会
  3. C# 读取硬盘信息类
  4. 用matlab求解工作时间调度问题,置换流水车间调度问题的MATLAB求解.doc
  5. 热榜!!!数据结构与算法:C语言版---数组与稀疏矩阵---强势来袭!
  6. MATLAB多元非线性回归
  7. C和指针之函数之可变参数
  8. Android之Android Studio--Gradle多渠道打包
  9. mysql数据库rp集群,使用MySQL-Cluster搭建MySQL数据库集群
  10. gearman mysql编译_gearman初探(一、编译和安装)