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