在面试时经常会问一个问题,请列举出hash在数据库内部的应用,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合并再拆分的思路是一样的。
分享到:
相关推荐
Oracle分区表中的Hash分区是一种基于哈希算法的分区策略,适用于处理无法清晰定义分区范围的大型数据表。这种分区方式通过计算分区键的哈希值来决定数据存储在哪个分区,以此达到数据分散和负载均衡的目的。Hash分区...
Oracle数据库分区表操作方法 Oracle数据库中的分区表是将大型数据表分割成多个小表,以提高应用系统的性能和方便数据管理。在本文中,我们将详细介绍分区表的使用方法和优点。 分区表的优点 使用分区表可以带来...
### Oracle 分区表详解 #### 一、Oracle 分区简介 Oracle 的分区技术是一种用于管理和优化超大型表和索引的有效手段。通过将一个大型的表或者索引分割成多个较小且可管理的部分,分区技术能够显著提升数据库的性能...
根据提供的文件信息,本文将详细解释Oracle分区技术及其在解决UNDOTBS01.DBF文件过大问题中的应用方法,并进一步探讨Oracle分区的不同类型及其应用场景。 ### Oracle 分区概述 Oracle分区是一种将大表或索引分割成...
- **组合分区**:结合以上两种或多种分区方法,例如Range-Hash分区。 #### 四、创建分区表和索引 ##### 创建Range分区 ```sql CREATE TABLE sales ( sale_date DATE, amount NUMBER ) PARTITION BY RANGE (sale_...
### Oracle表分区、建表空间与用户管理 #### 一、表空间的创建与管理 在Oracle数据库中,**表空间**(Tablespace)是物理存储的逻辑容器,它由一个或多个数据文件组成。创建一个新的表空间对于数据库的管理非常重要...
Oracle数据库中的表分区是一种优化大型数据表性能的技术,它将一个大表划分为多个更小、更易管理的部分,每个部分称为一个分区。通过分区,可以提高查询速度、简化管理和维护,以及改善备份和恢复的效率。以下是...
2. **Hash 分区**:通过散列函数分配数据,使得各分区大小相对均匀,适合于I/O负载均衡。 3. **List 分区**:允许按照预定义的值列表进行分区,但不支持多列分区。 4. **范围-散列分区**:首先根据范围分区,然后在...
2. Hash分区:通过哈希函数将数据均匀分散到各个分区,确保分区大小一致。 3. List分区:用户可以指定具体值将数据分配到特定分区,但不支持多列分区。 4. 范围-散列分区:先进行范围分区,再在每个范围内使用散列...
Oracle的分区是数据库管理系统中的一种高级特性,它允许将大表和索引分解为更小、更易管理的部分,称为“分区”。这种技术的主要目的是为了提高数据管理和查询性能,同时提供更好的可维护性和伸缩性。Oracle数据库...
2. 基于哈希的分区(Hash Partitioning):通过一个哈希函数将数据分配到不同的分区中。当表中的数据量很大且分布均匀时,此方法十分有效。 3. 综合分区(Composite Partitioning):结合了基于范围和基于哈希的...
- **Hash分区**(散列分区):基于字段值的哈希函数结果进行分区,使得相同值的数据均匀分布到各个分区,适合无序数据的场景。 - **复合分区**:结合两种或多种分区方式,例如范围-散列复合分区,可以同时利用范围...
Oracle 分区表及分区索引 Oracle 分区表是指将一个大表分割成多个小表,每个小表称为一个分区,分区表的优点是可以提高查询性能、改善管理型、增强容错性等。 分区表的分类: 1. 范围分区(Range Partitioning) ...
### Oracle 分区表总结 #### 一、Oracle分区表概述 在Oracle数据库中,分区是一种对大型表进行物理分割的方法,它可以显著提高查询性能并简化数据管理任务。通过将一个大表分成多个较小的部分(即分区),可以更快...
描述与标签:本文将深入探讨Oracle分区表的创建、管理以及查询技巧,重点包括范围分区(RANGE)、哈希分区(HASH)和列表分区(LIST),并涵盖复合分区(COMPOUND PARTITIONING)的概念。 ### 一、Oracle分区表概述...
2. 散列分区(Hash Partition):根据散列函数的结果将数据分布到不同的分区,适用于均匀分布数据。 3. 列表分区(List Partition):按预定义的值列表进行分区,适合于有限且固定的分区条件。 4. 复合分区...
Oracle 数据库中的表分区是一种强大的工具,它可以显著提高大型表的性能和管理效率。通过合理的分区设计,可以实现数据的快速访问、高效管理和灵活的维护操作。根据实际应用场景选择合适的分区类型(范围分区、列表...
然后,讨论了Oracle分区表的类型,包括范围分区(Range)、散列分区(Hash)、列表分区(List)、组合分区(Subpartition)、Interval分区和引用分区(Reference)。每种类型的分区都有其特点和应用场景。 在 VLDB ...
在Oracle数据库中,哈希(HASH)分区是一种有效的数据存储策略,它通过计算分区键的哈希值来决定数据应存储在哪个分区中。哈希分区表在处理大量数据时可以提供良好的查询性能,因为它们能够均匀地分散数据,使得查询...