oracle拆分分区语法详解大全_Oracle hash的分区方法详解
hash的原理雖然簡(jiǎn)單,但是它在數(shù)據(jù)庫(kù)中可以說是無處不在。其中hash partition是hash在數(shù)據(jù)庫(kù)中一個(gè)簡(jiǎn)單的應(yīng)用,雖然它沒有range partition那么常用,但是我們?cè)谧鰯?shù)據(jù)庫(kù)水平拆分時(shí),其實(shí)就是利用了hash partition的原理,利用hash函數(shù)對(duì)某個(gè)key進(jìn)行運(yùn)算,然后將其分布到不同的主機(jī)上,原理很簡(jiǎn)單。
我們?cè)谠O(shè)計(jì)時(shí)遇到了一個(gè)問題,當(dāng)分區(qū)的數(shù)量需要變化時(shí),基于hash的原理,數(shù)據(jù)可能會(huì)從一個(gè)分區(qū)移動(dòng)到另外一個(gè)分區(qū),因?yàn)槟硞€(gè)key在4個(gè)分區(qū)時(shí),可能被分布在分區(qū)3,而在8個(gè)分區(qū)時(shí),可能被分布在分區(qū)5。這樣每當(dāng)分區(qū)數(shù)量變化時(shí),就需要全部重新分布數(shù)據(jù),代價(jià)很高。
那么Oracle是怎么做的?首先可以肯定的是Oracle的hash partition在分區(qū)增加時(shí),不需要做全部數(shù)據(jù)的重新分布。有人告訴我Oracle的hash函數(shù)比較牛,可以保證分區(qū)數(shù)量增加時(shí),這個(gè)hash函數(shù)可以讓原來的數(shù)據(jù)還在舊的分區(qū)中,而新的數(shù)據(jù)可以分布在新的分區(qū)。Oracle的函數(shù)無非就是get_hash_value或ora_hash(10g),從hash的原理上來說,這也是不可能做到的。
我們對(duì)hash partition都有一個(gè)常識(shí),就是partition的數(shù)量最好是2的次方,也就是2,4,8,16……,否則分區(qū)會(huì)出現(xiàn)不分區(qū)均衡的現(xiàn)象,按照hash的原理,不管是幾個(gè)分區(qū),都可以做到完全均衡的,為什么會(huì)不均衡,其實(shí)答案已經(jīng)出來了,Oracle為了能夠增加分區(qū),為你預(yù)留了幾個(gè)看不到的分區(qū)。
假設(shè)我們有6個(gè)分區(qū),一共8000條數(shù)據(jù),數(shù)據(jù)的分布如下圖:
hash partition不能直接增加分區(qū),而是split當(dāng)前分區(qū),當(dāng)需要增加到8個(gè)分區(qū)時(shí),實(shí)際上是分區(qū)3和分區(qū)4分別split產(chǎn)生新的分區(qū)7和分區(qū)8,如下圖:
Oracle如何做到分區(qū)數(shù)量增加后,其他分區(qū)的數(shù)據(jù)不受影響呢,其實(shí)很簡(jiǎn)單,Oracle在做hash運(yùn)算時(shí),預(yù)留了分區(qū),比如6個(gè)分區(qū),實(shí)際上是用8個(gè)分區(qū)的hash來運(yùn)算的,只不過把缺少的分區(qū)的數(shù)據(jù)合并到其他分區(qū),這樣就會(huì)出現(xiàn)數(shù)據(jù)不均衡的情況。Oracle的公式是這樣的,用等于或者大于當(dāng)前分區(qū)數(shù)量的最小的一個(gè)2的N次方,比如6個(gè)分區(qū)做8個(gè)hash bucket。我們?cè)賮砜紤]一下2,4,8,16(2的N次方)的情況,比如要把4個(gè)分區(qū)加為5個(gè)分區(qū),因?yàn)橐呀?jīng)是2的N次方,所以數(shù)據(jù)會(huì)均勻分布,而且Oracle還是使用4個(gè)hash bucket。這時(shí)新增的分區(qū)5實(shí)際上把分區(qū)1 split后產(chǎn)生的,這時(shí)因?yàn)橛?個(gè)分區(qū)了,所以會(huì)使用8個(gè)hash bucket。這時(shí)Oracle的hash函數(shù)就比較牛了,它可以保證2,4,8,16個(gè)分區(qū)時(shí),同一個(gè)鍵值分布在相同的分區(qū)或者是對(duì)應(yīng)可以合并的分區(qū),看下面的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我們看到分區(qū)的數(shù)量在2,4,8,16時(shí),hellodba這個(gè)key分別落在在2,4,4,12號(hào)分區(qū),雖然落在不同的分區(qū)上,但是分區(qū)4和分區(qū)12是對(duì)應(yīng)可合并的,這樣就保證了數(shù)據(jù)是不需要移動(dòng)的。一句話總結(jié)就是hash bucket總是2的N次方,如果分區(qū)數(shù)不足,則會(huì)合并數(shù)據(jù),產(chǎn)生不均衡的情況,這樣增加分區(qū)時(shí),只需要對(duì)應(yīng)分區(qū)的數(shù)據(jù)做split即可。同理,減少分區(qū)也不是簡(jiǎn)單的drop,而是合并分區(qū)。
再回到我們的項(xiàng)目中,我們?yōu)榱私鉀Q這個(gè)問題,采用了更簡(jiǎn)單的處理方案,直接就做了1024個(gè)分區(qū),我們有8個(gè)物理數(shù)據(jù)庫(kù),每個(gè)數(shù)據(jù)庫(kù)中有128個(gè)表,以后再分拆時(shí),只要移動(dòng)這些表,并修改應(yīng)用中的對(duì)應(yīng)關(guān)系就可以了。其實(shí)和Oracle合并再拆分的思路是一樣的。
標(biāo)簽:
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,尊重他人勞動(dòng)成果
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載
0
好文不易,鼓勵(lì)一下吧!
總結(jié)
以上是生活随笔為你收集整理的oracle拆分分区语法详解大全_Oracle hash的分区方法详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker es持久化_使用docke
- 下一篇: yolo算法的优缺点分析_yolo算法介