引言:隨著互聯(lián)網(wǎng)技術(shù)以及互聯(lián)網(wǎng)商業(yè)的發(fā)展,大數(shù)據(jù)條件下高并發(fā)量、海量數(shù)據(jù)的性能直接影響著用戶的網(wǎng)上應(yīng)用。如何處理好這種海量數(shù)據(jù),已經(jīng)成為任何數(shù)據(jù)庫管理系統(tǒng)必須面對(duì)的挑戰(zhàn)。本文討論的內(nèi)容就是如何在生產(chǎn)實(shí)際中處理海量數(shù)據(jù)。
Oracle作為一種數(shù)據(jù)庫,處理海量數(shù)據(jù)最基本的方法就是“分而治之”,即將海量表拆成小表,具體技術(shù)而言就是采用分區(qū)表的形式拆分大表,從而提高用戶在海量數(shù)據(jù)環(huán)境下的用戶體驗(yàn),減少DBA維護(hù)的時(shí)間和精力成本從而有效降低海量數(shù)據(jù)處理的復(fù)雜度。
海量數(shù)據(jù)的特點(diǎn)是在高并發(fā)環(huán)境下的高數(shù)據(jù)量,這樣就造成傳統(tǒng)的單表(具有單獨(dú)的段標(biāo)識(shí))很大。如此大的數(shù)據(jù)量,極有可能引起數(shù)據(jù)訪問以及管理的各種問題。
圖1 分區(qū)表示意圖
圖2 高效歸檔海量數(shù)據(jù)分區(qū)表示意圖
Oracle解決這種海量數(shù)據(jù)的方法是利用分區(qū)表技術(shù)。所謂的分區(qū)表就是依據(jù)分區(qū)主鍵而創(chuàng)建的多個(gè)獨(dú)立的表。對(duì)應(yīng)用而言它只是一個(gè)表,而在底層是由幾個(gè)獨(dú)立分區(qū)組成,每個(gè)分區(qū)具有自己的段標(biāo)識(shí)以及段的高水位線。圖1是按照時(shí)間分區(qū)的分區(qū)表示意圖。從圖1可以看出,分區(qū)表在物理上是獨(dú)立的存儲(chǔ)段,其優(yōu)點(diǎn)是:其一,數(shù)據(jù)分布到多個(gè)獨(dú)立的段中,單個(gè)段的損壞不影響其他段的數(shù)據(jù),提高了段的可用性;其二,對(duì)每個(gè)分區(qū)實(shí)施單獨(dú)的備份和恢復(fù)策略,提供了段管理的靈活性;其三,不同的物理分區(qū)可以存儲(chǔ)到不同的物理磁盤上從而來分散I/O,提高了數(shù)據(jù)I/O性能。
對(duì)歷史數(shù)據(jù)的備份在成熟的信息化應(yīng)用系統(tǒng)中占有十分重要的地位。對(duì)歷史數(shù)據(jù)進(jìn)行歸檔,降低其數(shù)據(jù)量,消除磁盤碎片,可以使得系統(tǒng)高效運(yùn)行。
在有數(shù)據(jù)需要?dú)w檔時(shí),分區(qū)表的作用就發(fā)揮出來,按照時(shí)間進(jìn)行分區(qū),對(duì)于數(shù)據(jù)歸檔,數(shù)據(jù)維護(hù),數(shù)據(jù)的可用性都有好處。圖2是分區(qū)表高效歸檔海量數(shù)據(jù)示意圖。
在生產(chǎn)實(shí)際中,經(jīng)常需要按照時(shí)間進(jìn)行歷史數(shù)據(jù)歸檔,隨著數(shù)據(jù)量的快速增長,需要?dú)w檔這些歷史數(shù)據(jù),如果此時(shí)采用了時(shí)間分區(qū),前提是該表有時(shí)間字段作為分區(qū)主鍵,就很容易使用分區(qū)技術(shù)快速高效地實(shí)現(xiàn)數(shù)據(jù)歸檔。如當(dāng)前表為T-CURR是按照表中T-date字段的分區(qū)表,每個(gè)月一個(gè)分區(qū),可按照如下步驟實(shí)現(xiàn)數(shù)據(jù)歸檔:先創(chuàng)建中間臨時(shí)表T-MID。然后創(chuàng)建歷史分區(qū)表T-HIST。最后進(jìn)行分區(qū)交換。
這里的歷史表T-HIST和當(dāng)前的表T-CURR結(jié)構(gòu)相同,唯一區(qū)別就是名稱不同。而中間臨時(shí)表T-MID與需要交換的分區(qū)具有相同的表結(jié)構(gòu)。下面是具體的交換過程:
這樣通過兩次分區(qū)交換完成當(dāng)前表中分區(qū)d1中的數(shù)據(jù)歸檔,此時(shí)使用including indexes包含索引段的交換,如果是本地索引則不需要重建歷史歸檔表中的本地索引,這里的without validation指出不需要數(shù)據(jù)驗(yàn)證,這樣就不需要在交換前對(duì)T-MID中的數(shù)據(jù)進(jìn)行全表掃描,提高分區(qū)交換的效率。
圖3 分區(qū)表示意圖
海量數(shù)據(jù)環(huán)境下,高并發(fā)量的數(shù)據(jù)對(duì)單表而言會(huì)數(shù)據(jù)存儲(chǔ)空間的不足造成高水位推進(jìn)的問題,從而影響到數(shù)據(jù)的并發(fā)處理。而通過分布表技術(shù)可以有效化解這個(gè)難題。在生成系統(tǒng)中會(huì)出現(xiàn)enq:HW或者enq:FB等待事件,在RAC集群環(huán)境下出現(xiàn)大量gc current grant等待事件,這些都是和高水位推進(jìn)相關(guān)的等待事件。
當(dāng)數(shù)據(jù)插入分區(qū)表時(shí),如果表段的空間不足會(huì)首先格式化一組新數(shù)據(jù)塊,只有格式化完成才能繼續(xù)插入數(shù)據(jù),否則當(dāng)前數(shù)據(jù)插入的會(huì)話會(huì)出現(xiàn)等待HW/FB鎖的等待。
可以想象在海量數(shù)據(jù)環(huán)境下,高并發(fā)量、高數(shù)據(jù)量的特點(diǎn)必然因?yàn)檫@種等待的加劇,從而影響數(shù)據(jù)插入的性能。此時(shí)如果合理使用分區(qū)表即可有效緩解這種等待。一旦將表分區(qū),則每個(gè)分區(qū)具有獨(dú)立的段標(biāo)識(shí),對(duì)應(yīng)獨(dú)立的高水位線管理。這樣就將數(shù)據(jù)插入均衡到多個(gè)分區(qū)中,從而有效緩解HW鎖的爭(zhēng)用。
圖3為高水位推進(jìn)打算之后的分區(qū)表示意圖,其說明高水位推進(jìn)打算之后的示意圖,并發(fā)環(huán)境下使用分區(qū)表時(shí)每個(gè)分區(qū)表一個(gè)高水位線,避免了單個(gè)段的高水位等待問題。
在RAC集群環(huán)境下,有效提高了數(shù)據(jù)的高可用性、可擴(kuò)展性、負(fù)載均衡等,提高了系統(tǒng)處理海量數(shù)據(jù)的能力。結(jié)合集群環(huán)境的實(shí)際,需要考慮如何有效使用好分區(qū)表。合理的分區(qū)表使用可以減少實(shí)例間的數(shù)據(jù)爭(zhēng)用。減少節(jié)點(diǎn)之間的網(wǎng)絡(luò)流量,從而優(yōu)化整個(gè)集群系統(tǒng)的性能。
如果條件允許,采用應(yīng)用分區(qū)是十分有效的較少集群實(shí)例間數(shù)據(jù)流量的方法,它可以極大減少表的global buffer busy等待。即將每個(gè)區(qū)域的用戶綁定到服務(wù)器連接池組中的某個(gè)固定的實(shí)例,固定的實(shí)例只用來訪問一個(gè)固定區(qū)域用戶的分區(qū),這樣就極大較少了實(shí)例對(duì)相同數(shù)據(jù)塊的爭(zhēng)用,從而避免global buffer busy帶來的爭(zhēng)用問題。
如果條件不允許使用應(yīng)用分區(qū),則需要詳細(xì)分區(qū)訪問該海量表的SQL語句特點(diǎn),從而設(shè)計(jì)對(duì)應(yīng)的分區(qū)方案。如果SQL的謂詞中大量的出現(xiàn)某個(gè)字段的=條件,則可以選擇該字段作為HASH分區(qū)的主鍵,從而盡最大可能將數(shù)據(jù)打算,這樣通過將數(shù)據(jù)打散到不同的分區(qū)中,從而有效減少熱快沖突的概率,提高整個(gè)集群的性能。
在使用分區(qū)技術(shù)時(shí),合理的分區(qū)主鍵與分區(qū)粒度的選擇十分重要,否則很難發(fā)揮分區(qū)表的優(yōu)勢(shì)。
分區(qū)主鍵是指實(shí)現(xiàn)表分區(qū)的字段,如表中的T_date字段實(shí)現(xiàn)按照時(shí)間分區(qū)。分區(qū)粒度是分區(qū)大小,如按照時(shí)間分區(qū)是以月為單位還是以年為單位,這些直接影響分區(qū)優(yōu)勢(shì)的發(fā)揮。
總之在設(shè)計(jì)分區(qū)前要根據(jù)業(yè)務(wù)需要,制定滿足性能、維護(hù)等需求的分區(qū)方案,選擇好分區(qū)主鍵與分區(qū)粒度。
分區(qū)主鍵的選擇主要考慮分區(qū)目的。如果是歸檔數(shù)據(jù)顯然使用時(shí)間字段實(shí)現(xiàn)范圍分區(qū);如果主要是打散數(shù)據(jù)分解全局?jǐn)?shù)據(jù)沖突可以考慮謂詞中的對(duì)應(yīng)字段作為分區(qū)主鍵。即分區(qū)主鍵的選擇原則是它是否經(jīng)常出現(xiàn)在查詢語句的謂詞條件中。
如果在系統(tǒng)上線之后實(shí)現(xiàn)分區(qū),此時(shí)DBA不清楚那些SQL經(jīng)常訪問,以及如何訪問這些海量表,所以需要不斷的分區(qū)共享池中的SQL語句,分區(qū)過濾條件和連接條件,從而合理判斷分區(qū)主鍵。在選擇了分區(qū)主鍵之后,必須保證該字段是非空的。
在確定了分區(qū)主鍵之后,就需要考慮分區(qū)粒度的選擇。而分區(qū)粒度的選擇沒有固定的原則,適合系統(tǒng)需要就好,更好的服務(wù)于應(yīng)用系統(tǒng)就是好的分區(qū),但是這也是分區(qū)粒度的難點(diǎn)。不同目的采用不同分區(qū)方法。以下列舉三個(gè)目的作為說明:
(1)便于維護(hù):需要考慮多大的分區(qū)維護(hù)起來方便,滿足維護(hù)時(shí)間窗口的條件,如果分區(qū)歸檔要求15分鐘完成,則顯然對(duì)分區(qū)粒度的大小有限制,這需要做實(shí)驗(yàn)分區(qū),從而滿足自己系統(tǒng)軟硬件條件的容量限制。
(2)便于歸檔:歸檔頻率需要考慮,即多久歸檔一次,顯然歸檔周期就是分區(qū)粒度需要考慮的首要因素
(3)便于提高性能:需要考慮表的范圍掃描的范圍高概率發(fā)生在哪個(gè)時(shí)間范圍內(nèi), 這樣根據(jù)多數(shù)數(shù)據(jù)查詢的掃描時(shí)間范圍設(shè)計(jì)分區(qū)粒度比較好。
本文分析了如何在高并發(fā)量以及高數(shù)據(jù)量的環(huán)境下提高數(shù)據(jù)訪問性能。Oracle數(shù)據(jù)庫通過分區(qū)表技術(shù)可以有效解決這個(gè)難題。
分區(qū)技術(shù)的使用需要針對(duì)具體場(chǎng)合以及結(jié)合分區(qū)表的特點(diǎn)作出合理的分區(qū)粒度以及分區(qū)鍵的選擇。在RAC集群環(huán)境下合理使用應(yīng)用分區(qū)可以極大減少實(shí)例之間數(shù)據(jù)通信以及實(shí)例間協(xié)商的開銷,從而提高RAC的整體性能。