專利名稱:面向列存儲數(shù)據(jù)倉庫的多維olap查詢處理方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種0LAP(聯(lián)機(jī)分析處理)查詢處理方法,尤其涉及一種面向列存儲數(shù)據(jù)倉庫,基于星型連接模型的多維OLAP查詢處理方法,屬于數(shù)據(jù)庫管理技術(shù)領(lǐng)域。
背景技術(shù):
聯(lián)機(jī)分析處理(On-Line Analytical Processing,簡寫為0LAP)的設(shè)計(jì)目標(biāo)是滿足決策支持或者多維環(huán)境下特定的查詢和報(bào)表需求。數(shù)據(jù)倉庫和OLAP是企業(yè)級決策處理的重要支撐技術(shù)。但是,海量數(shù)據(jù)上的OLAP性能難以滿足日益增長的實(shí)時(shí)高性能分析處理的需求。 其性能的瓶頸主要體現(xiàn)在兩個(gè)方面一是較低的硬盤I/o性能,二是查詢處理技術(shù)不夠優(yōu)化。提高硬盤I/o性能的主流技術(shù)是列存儲。列存儲可以實(shí)現(xiàn)對數(shù)據(jù)按列存儲和訪問。目前,列存儲數(shù)據(jù)庫采用的查詢處理技術(shù)主要有兩類,一類是列數(shù)據(jù)查詢處理技術(shù),另一類是通過數(shù)據(jù)在內(nèi)存的緩存將列存儲數(shù)據(jù)動態(tài)轉(zhuǎn)換為行存儲數(shù)據(jù),然后使用傳統(tǒng)的行存儲查詢處理技術(shù)。列數(shù)據(jù)查詢處理技術(shù)將關(guān)系代數(shù)細(xì)化為列代數(shù),將關(guān)系操作分解為若干有序的列操作。列數(shù)據(jù)查詢處理技術(shù)需要產(chǎn)生大量的物化連接索引和額外的列間連接操作代價(jià),在OLAP查詢中需要對事實(shí)表外鍵列進(jìn)行兩次掃描以完成過濾和分組操作,增加了額外的I/O訪問開銷。當(dāng)前廣泛采用的動態(tài)列/行轉(zhuǎn)換查詢處理技術(shù),通過將數(shù)據(jù)按列訪問提高投影操作的I/o效率,但在查詢處理層次上仍然采用行存儲的流水線(pipeline)查詢處理技術(shù)。該流水線查詢處理技術(shù)要對查詢處理所需的連接數(shù)據(jù)進(jìn)行先物化,當(dāng)選擇率較低時(shí),大量物化數(shù)據(jù)最終被拋棄,消耗了額外的內(nèi)存帶寬資源,降低了內(nèi)存處理性能。并行OLAP的主要應(yīng)用場景是內(nèi)存數(shù)據(jù)庫。在行存儲數(shù)據(jù)庫中,具有代表性的技術(shù)是采用物化連接的方法將多個(gè)表物化為一個(gè)非規(guī)范化連接表,然后基于水平分片模式對可分布式聚集函數(shù)進(jìn)行并行處理并合并聚集結(jié)果集。這種技術(shù)簡化了查詢處理的復(fù)雜度并提高了并行加速比,但需要付出較大的空間代價(jià)。在列存儲模型上,具有代表性的技術(shù)是將執(zhí)行代價(jià)大的列間連接操作進(jìn)行邏輯水平分片后再并行連接,然后將并行連接結(jié)果合并后再參與其后的列操作。該技術(shù)實(shí)現(xiàn)過程簡單,但串行處理的負(fù)載比例較高,整體并行處理資源未能得到充分的發(fā)揮。對于磁盤數(shù)據(jù)庫的應(yīng)用場景,并行OLAP的處理性能受磁盤并行訪問I/O性能的制約,較少采用基于水平分片模式的并行處理技術(shù),而是采用共享磁盤掃描模式的并發(fā)查詢處理技術(shù)。該并發(fā)查詢處理技術(shù)的核心是最小化OLAP的內(nèi)存處理時(shí)間,使一個(gè)I/O延遲內(nèi)能夠處理盡可能多的并發(fā)查詢?nèi)蝿?wù)。傳統(tǒng)的哈希連接在并發(fā)查詢處理負(fù)載下產(chǎn)生大量的哈希表,這些哈希表將耗盡系統(tǒng)的內(nèi)存資源,從而導(dǎo)致哈希連接的性能變差。OLAP查詢的選擇率相對較高,因此并發(fā)查詢處理面臨更大的性能瓶頸,在實(shí)踐中難以獲得理想的性能。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題在于提供一種面向列存儲數(shù)據(jù)倉庫,基于星型連接模型的多維OLAP查詢處理方法。該方法可以提高列存儲的I/O性能,實(shí)現(xiàn)基于一趟列掃描基礎(chǔ)上的OLAP查詢處理。為解決上述的技術(shù)問題,本發(fā)明采用下述的技術(shù)方案一種面向列存儲數(shù)據(jù)倉庫的多維OLAP查詢處理方法,將OLAP查詢分解為位圖過濾操作、分組操作和聚集操作,事實(shí)表和維表采用列存儲模型進(jìn)行存儲,其特征在于在位圖過濾操作中,首先將謂詞在維表上執(zhí)行并生成謂詞向量位圖。在查詢處理時(shí),順序掃描連接操作對應(yīng)的多個(gè)事實(shí)表外鍵屬性列,通過代理鍵地址映射將連接操作轉(zhuǎn)換為對位圖的直接按位置訪問操作,并抽取相應(yīng)維表謂詞向量中相應(yīng)位進(jìn)行與操作來判斷該事實(shí)表記錄是否滿足連接過濾條件;在分組操作中,將滿足過濾條件的事實(shí)表記錄按SQL命令中的分組屬性預(yù)生成分 組單元并分配遞增的ID,并在事實(shí)表過濾分組向量中將該記錄位置對應(yīng)的向量值設(shè)置為當(dāng)前分組ID ;在聚集操作中,通過對事實(shí)表度量屬性的一趟列掃描實(shí)現(xiàn)按事實(shí)表過濾分組向量進(jìn)行分組聚集計(jì)算。其中較優(yōu)地,將維屬性列加載到內(nèi)存形成內(nèi)存維屬性數(shù)組,所述主鍵對應(yīng)所述內(nèi)存維屬性數(shù)組的下標(biāo);事實(shí)表記錄的外鍵屬性值映射為對應(yīng)維表中內(nèi)存維屬性數(shù)組的下標(biāo);所述事實(shí)表和所述維表通過外鍵與主鍵的對應(yīng)關(guān)系完成多表連接操作。其中較優(yōu)地,當(dāng)內(nèi)存不能容納全部維表時(shí),將查詢處理中需要訪問的維表分組屬性列加載入內(nèi)存形成內(nèi)存維向量,在維表上進(jìn)行謂詞操作,將謂詞操作結(jié)果存儲在一個(gè)與維表等長的位圖中,作為謂詞向量來記錄每一個(gè)維表記錄對謂詞操作結(jié)果的滿足狀態(tài)。其中較優(yōu)地,預(yù)創(chuàng)建分組聚集哈希表和事實(shí)表過濾分組向量,所述分組聚集哈希表以查詢中的分組屬性和附加ID為對象進(jìn)行預(yù)創(chuàng)建,所述事實(shí)表過濾分組向量為與事實(shí)表等長的數(shù)值型向量。其中較優(yōu)地,順序掃描事實(shí)表中具有維表連接關(guān)系的外鍵屬性組,讀取每一條外鍵屬性組記錄,將事實(shí)表外鍵屬性值直接映射為謂詞向量下標(biāo)并取出謂詞向量中該位所記錄的位數(shù)據(jù)進(jìn)行與操作;如果位運(yùn)算結(jié)果為假,則繼續(xù)讀取下一條外鍵屬性組記錄;如果位運(yùn)算結(jié)果為真,則將各個(gè)外鍵的值映射為維表分組屬性向量的下標(biāo)。其中較優(yōu)地,抽取分組維屬性向量中指定的數(shù)據(jù)項(xiàng)后進(jìn)行哈希分組;如果當(dāng)前哈希鍵值已存在,則取出該哈希分組ID并記入事實(shí)表過濾分組向量中與當(dāng)前事實(shí)表記錄相對應(yīng)的位置中;如果當(dāng)前哈希鍵值不存在,則在分組哈希表中創(chuàng)建一個(gè)新的哈希分組,并分配遞增的ID,同時(shí)將該哈希分組ID記錄在事實(shí)表連接向量中與當(dāng)前事實(shí)表記錄相應(yīng)的位置上。其中較優(yōu)地,在事實(shí)表外鍵屬性組掃描完畢后,得到事實(shí)表過濾分組向量和預(yù)設(shè)的分組聚集哈希表,按最大ID值創(chuàng)建聚集函數(shù)的數(shù)組作為分組聚集累加器。其中較優(yōu)地,當(dāng)在所述事實(shí)表過濾分組向量中掃描到一個(gè)非零數(shù)據(jù)項(xiàng)時(shí),按向量下標(biāo)位置訪問磁盤列存儲的度量屬性,并將度量屬性值送入所述事實(shí)表過濾分組向量中哈希分組ID值對應(yīng)的分組聚集累加器數(shù)組下標(biāo)的單元中進(jìn)行聚集計(jì)算。其中較優(yōu)地,在所有的度量屬性列完成聚集計(jì)算后,將分組聚集哈希表與各分組聚集累加器按ID和數(shù)組下標(biāo)順序進(jìn)行合并,生成最終的OLAP聚集結(jié)果。其中較優(yōu)地,如果查詢處理過程中包含多個(gè)聚集函數(shù),依次通過掃描事實(shí)表過濾分組向量的方式處理每個(gè)聚集函數(shù)。本發(fā)明具有如下的有益效果(I)無須借助于索引實(shí)現(xiàn)高性能OLAP查詢處理;(2)通過代理鍵的地址映射實(shí)現(xiàn)事實(shí)表按外鍵屬性直接定位到維表中相匹配的記錄項(xiàng),降低了連接算法的復(fù)雜度,提高了星型多表連接操作的性能和效率; (3)只需要對事實(shí)表進(jìn)行一趟列掃描即可完成全部的OLAP處理任務(wù),避免了多趟列掃描的代價(jià);(4)能夠支持各類聚集函數(shù)的并行處理。
下面結(jié)合附圖和具體實(shí)施方式
對本發(fā)明作進(jìn)一步的說明。圖I為本發(fā)明所提供的⑶DTA-JOIN方法的數(shù)據(jù)結(jié)構(gòu)和查詢處理流程示意圖;圖2為對非代理鍵的維表主鍵進(jìn)行鍵值轉(zhuǎn)換的示意圖;圖3為行訪問模式下的⑶DTA-JOIN方法示意圖;圖4為當(dāng)查詢中包含多個(gè)聚集函數(shù)時(shí)的并行⑶DTA-JOIN方法示意圖;圖5為采用事實(shí)表水平分片模式的并行⑶DTA-JOIN方法示意圖;圖6為對于不可分布聚集函數(shù),以中位數(shù)聚集函數(shù)為例的多核并行算法示意圖。
具體實(shí)施例方式OLAP查詢處理的核心是星型連接(star-join),即在事實(shí)表與多個(gè)維表連接的基礎(chǔ)上對連接結(jié)果進(jìn)行分組聚集計(jì)算。在此基礎(chǔ)上,本發(fā)明提供了一種多維OLAP查詢處理方法。該方法在列存儲數(shù)據(jù)倉庫的基礎(chǔ)上實(shí)現(xiàn)高性能的內(nèi)存星型連接處理,通過對事實(shí)表進(jìn)行一趟列掃描即可完成全部的OLAP查詢處理任務(wù),尤其適合在多核處理器平臺上使用?;谠揙LAP查詢處理方法的上述特點(diǎn),本發(fā)明人將其簡稱為⑶DTA-JOIN (CoIumn DirectlyDimensional Tuple Accessing-JOIN)方法。下面對此展開詳細(xì)具體的說明。圖I顯示了本發(fā)明所提供的⑶DTA-JOIN方法的數(shù)據(jù)結(jié)構(gòu)和查詢處理流程。該方法的核心技術(shù)思想在于將標(biāo)準(zhǔn)OLAP查詢分解為位圖過濾操作、分組操作和聚集操作。在位圖過濾操作中,首先將謂詞(包括但不限于SQL命令中的where子句)在維表上執(zhí)行并生成謂詞向量位圖(bitmap),通過代理鍵的地址映射將連接操作轉(zhuǎn)換為直接維表記錄訪問操作,實(shí)現(xiàn)按位置進(jìn)行訪問。分組操作用于實(shí)現(xiàn)將滿足連接過濾條件的事實(shí)表記錄按SQL命令中的分組(group by)屬性預(yù)生成分組單元并分配遞增的ID。聚集操作通過對事實(shí)表度 量屬性的一趟列掃描算法實(shí)現(xiàn)按位圖過濾操作結(jié)果的分組單元進(jìn)行分組聚集計(jì)算。此處的分組聚集計(jì)算是指先分組,然后按分組進(jìn)行聚集,包括分組聚集哈希表,分組聚集操作等。這樣,OLAP查詢處理所需要的臨時(shí)數(shù)據(jù)最小化為維表上的謂詞向量和事實(shí)表上的過濾分組向量,能夠保證臨時(shí)數(shù)據(jù)的內(nèi)存駐留性能,確保OLAP查詢處理的高性能。在本CDDTA-JOIN方法中,包括事實(shí)表和維表在內(nèi)的數(shù)據(jù)采用列存儲模型進(jìn)行存儲。其中,維表主鍵為代理鍵,即自然遞增數(shù)列1,2,3…。非代理鍵的維表主鍵通過動態(tài)轉(zhuǎn)換規(guī)則在訪問時(shí)實(shí)時(shí)映射為代理鍵。通過內(nèi)存列存儲技術(shù)將全部或部分維屬性列(謂詞屬性列和分組屬性列)加載到內(nèi)存形成內(nèi)存維屬性數(shù)組,主鍵對應(yīng)內(nèi)存維屬性數(shù)組的下標(biāo)。事實(shí)表記錄的外鍵屬性值直接映射為對應(yīng)維表中內(nèi)存維屬性數(shù)組下標(biāo)。事實(shí)表與維表通過外鍵與主鍵之間的對應(yīng)關(guān)系完成多表連接操作(例如星型連接),從而實(shí)現(xiàn)事實(shí)表按外鍵屬性值直接訪問內(nèi)存維屬性數(shù)組中指定下標(biāo)的數(shù)據(jù)項(xiàng)。上述通過代理鍵的地址映射實(shí)現(xiàn)事實(shí)表按外鍵屬性值直接定位到維表中相匹配的記錄項(xiàng)的技術(shù)方案,降低了連接算法的復(fù)雜度,提高了連接算法的性能和效率。當(dāng)內(nèi)存充足時(shí),維表被全部加載到內(nèi)存以向量結(jié)構(gòu)進(jìn)行存儲,向量下標(biāo)與維表代理鍵值相對應(yīng);當(dāng)內(nèi)存不能夠容納全部維表時(shí),將查詢處理中需要訪問的維表分組屬性列加載入內(nèi)存形成內(nèi)存維向量,在維表上進(jìn)行謂詞操作,將謂詞操作結(jié)果存儲在一個(gè)與維表等長的位圖(bitmap)中,作為謂詞向量來記錄每一個(gè)維表記錄對謂詞操作結(jié)果的滿足狀 態(tài)(I表示滿足全部謂詞操作,O表示不滿足)。如果內(nèi)存容量不足以容納全部維表記錄,則按如下優(yōu)先級進(jìn)行維表內(nèi)存化分組屬性一謂詞操作屬性一全部維屬性。維屬性在內(nèi)存列中存儲時(shí)可以應(yīng)用數(shù)據(jù)壓縮技術(shù)進(jìn)一步降低內(nèi)存消耗。分組屬性和謂詞操作屬性可以在查詢處理時(shí)通過增量的方式加載,并在內(nèi)存維屬性管理中按LRU(Least Recently Used,最近最少使用)策略淘汰訪問頻率低的維屬性列以容納新的維屬性列。所謂謂詞向量是指將SQL命令中的謂詞操作(包括但不限于SQL命令中的where子句)應(yīng)用于對應(yīng)的維表上,并產(chǎn)生一個(gè)用于標(biāo)識每條維表記錄是否滿足所有謂詞條件的位圖(bitmap),稱之為謂詞向量。在順序掃描事實(shí)表記錄并進(jìn)行多表連接時(shí),用訪問維表謂詞向量代替對維屬性數(shù)組中數(shù)據(jù)項(xiàng)的訪問和謂詞計(jì)算,用謂詞向量作為維表上的連接過濾判斷條件。在查詢處理時(shí),每個(gè)維表只有謂詞向量和查詢所訪問的維表分組屬性需要加載到內(nèi)存,從而降低對內(nèi)存空間的需求。下面,以如下查詢?yōu)槔唧w說明⑶DTA-JOIN方法的處理過程SELECT c_nation, s_nation, d_year sum(lo_revenue)as revenue, sum(lo_orders)as ordersFROM customer, supplier, date, lineorderWHERE lo_custkey = c_custkeyAND lo_suppkey = s_suppkeyAND lo_orderdate = dateidAND c_region =’ Asia,AND s_region =’ Asia,AND d_year in[1992,1997]GROUP BY c_nation, s_nation, d_year ;首先根據(jù)查詢的分組聚集屬性預(yù)創(chuàng)建分組聚集哈希表。為事實(shí)表創(chuàng)建過濾分組向量,用于標(biāo)識滿足連接過濾條件的事實(shí)表記錄位置和其對應(yīng)的哈希分組聚集單元的ID。分組聚集哈希表以查詢中的分組屬性和附加的自動累加的ID為對象進(jìn)行預(yù)創(chuàng)建,不包括聚集函數(shù)字段。事實(shí)表過濾分組向量為與事實(shí)表等長的數(shù)值型(根據(jù)聚集分組最大ID值決定采用數(shù)值型數(shù)據(jù)的寬度)向量,預(yù)設(shè)值為O。該向量是先過濾后分組形成的,故稱為過濾分組向量。順序掃描事實(shí)表中具有維表連接關(guān)系的外鍵屬性組,讀取每一條外鍵屬性組記錄,將事實(shí)表外鍵屬性值直接映射為謂詞向量下標(biāo)并取出謂詞向量中該位所記錄的位數(shù)據(jù) 進(jìn)行AND (與)位運(yùn)算。如果位運(yùn)算結(jié)果為假,則繼續(xù)讀取下一條外鍵屬性組記錄;如果位運(yùn)算結(jié)果為真,則將各個(gè)外鍵的值映射為維表分組屬性向量的下標(biāo)。抽取分組維屬性向量中指定的數(shù)據(jù)項(xiàng)后進(jìn)行哈希分組。如果當(dāng)前哈希鍵值已存在,則取出該哈希分組ID并記入事實(shí)表過濾分組向量中與當(dāng)前事實(shí)表記錄相對應(yīng)的位置中;如果當(dāng)前哈希鍵值不存在,則在分組哈希表中創(chuàng)建一個(gè)新的哈希分組,并分配遞增的ID,同時(shí)將該哈希分組ID記錄在事實(shí)表連接向量中與當(dāng)前事實(shí)表記錄相應(yīng)的位置上。事實(shí)表外鍵屬性組掃描完畢后,得到事實(shí)表過濾分組向量和預(yù)設(shè)的分組聚集哈希表,按最大ID值創(chuàng)建聚集函數(shù)的數(shù)組作為分組聚集累加器。參照圖I所示的實(shí)施例,假設(shè)維表全部加載為內(nèi)存維向量,在三個(gè)維表上應(yīng)用對應(yīng)的謂詞得到位圖(bitmap)形式的謂詞向量。首先從磁盤上掃描三個(gè)維表的外鍵列l(wèi)o_custkey, lo_suppkey, I o_orderdate,例如當(dāng)掃描到事實(shí)表外鍵屬性組記錄(3,1,1)時(shí)(圖I中較深的顏色表示當(dāng)前訪問記錄),同時(shí)訪問customer, supplier, date維表上的謂詞向量中第3,1,1位并進(jìn)行AND(與)位運(yùn)算。如果位運(yùn)算結(jié)果為1,則從c_nation,s_nation, d_year維向量中抽取第3,1,1位的屬性值“ India”, “Russia”, 1997并計(jì)算出對應(yīng)的哈希鍵值。在分組聚集哈希表中查找該哈希鍵值,如果存在則將該哈希分組的ID值記錄到事實(shí)表過濾分組向量的對應(yīng)位置;如果不存在相同的哈希鍵值則創(chuàng)建一個(gè)新的哈希分組并分配遞增的ID,同時(shí)將該ID記錄在事實(shí)表過濾分組向量的對應(yīng)位置上。事實(shí)表外鍵屬性組掃描結(jié)束后生成了分組聚集哈希表和事實(shí)表過濾分組向量。接下來掃描事實(shí)表過濾分組向量,分別處理查詢中的聚集計(jì)算。當(dāng)在事實(shí)表過濾分組向量中掃描到一個(gè)非零數(shù)據(jù)項(xiàng)時(shí),按向量下標(biāo)位置訪問磁盤列存儲的度量屬性(需要數(shù)據(jù)庫支持對磁盤列存儲數(shù)據(jù)的按偏移位置訪問),并將度量屬性值送入事實(shí)表過濾分組向量中與哈希分組ID值相同的分組聚集累加器數(shù)組對應(yīng)下標(biāo)的單元進(jìn)行聚集計(jì)算(即累力口)并更新結(jié)果,如圖I中度量值43256累加到revenue數(shù)組的第一個(gè)單元中,度量值65466累加到revenue數(shù)組的第二個(gè)單元中。完成對度量屬性revenue的處理后,再次掃描事實(shí)表過濾分組向量,對度量屬性lo_order進(jìn)行聚集計(jì)算。根據(jù)分組聚集哈希表中ID的最大值創(chuàng)建聚集計(jì)算數(shù)組(分組聚集累加器),數(shù)組下標(biāo)對應(yīng)分組聚集累加器的哈希分組ID。此處的分組聚集累加器是指根據(jù)哈希分組器ID的數(shù)量為SQL命令中的每一個(gè)聚集函數(shù)生成一個(gè)數(shù)組,用于在對事實(shí)表度量屬性進(jìn)行一趟列掃描時(shí)實(shí)現(xiàn)分組聚集計(jì)算結(jié)果的存儲。當(dāng)掃描連接結(jié)果向量時(shí),遇到非零向量數(shù)據(jù)項(xiàng)時(shí)根據(jù)其位置訪問事實(shí)表屬性列對應(yīng)位置的度量值并根據(jù)連接結(jié)果向量值所對應(yīng)的ID將度量屬性值在分組聚集累加器數(shù)組與ID對應(yīng)的數(shù)據(jù)單元中進(jìn)行聚集計(jì)算。在所有的度量屬性列完成聚集計(jì)算后,將分組聚集哈希表與各分組聚集累加器數(shù)組按ID和數(shù)組下標(biāo)順序進(jìn)行合并,生成最終的OLAP聚集結(jié)果(即查詢處理結(jié)果)。在對度量屬性列的訪問中,本發(fā)明一方面避免了傳統(tǒng)的列處理算法中需要對連接屬性列進(jìn)行多次掃描來獲得最終連接結(jié)果的代價(jià);另一方面通過位圖過濾操作獲得事實(shí)表過濾分組向量后能夠?qū)κ聦?shí)表度量屬性列實(shí)現(xiàn)按位置直接訪問。當(dāng)查詢的總選擇率(每個(gè)維表上的選擇率相對較高,但對多個(gè)維表的連接操作導(dǎo)致最終選擇率較低)較低時(shí),本方法能夠極大地減少對事實(shí)表度量屬性列訪問的I/o代價(jià)或內(nèi)存帶寬消耗。
上述的分組聚集哈希表是指通過位圖過濾操作(謂詞向量作為維表上的連接過濾器)和對維表記錄按位置訪問,完成事實(shí)表與多個(gè)維表之間的星型連接。在多表連接操作執(zhí)行前,預(yù)生成事實(shí)表過濾分組向量和預(yù)分組哈希表。事實(shí)表過濾分組向量記錄了滿足連接過濾條件的事實(shí)表記錄所對應(yīng)的哈希分組ID。在多表連接操作執(zhí)行時(shí),每一個(gè)滿足所有維表謂詞向量過濾條件的事實(shí)表記錄按外鍵屬性值直接訪問維表分組屬性列數(shù)組下標(biāo)對應(yīng)的數(shù)據(jù)項(xiàng),抽取出分組屬性值并與分組哈希表進(jìn)行匹配。如果在分組聚集哈希表中找到相同的分組項(xiàng),則將哈希分組的ID值復(fù)制到連接結(jié)果向量中該事實(shí)表記錄對應(yīng)的位置;如果在分組聚集哈希表中未找到相同的分組項(xiàng),則增加一個(gè)新的哈希分組項(xiàng)并分配一個(gè)遞增的分組ID,同時(shí)將該哈希分組ID復(fù)制到事實(shí)表過濾分組向量中該事實(shí)表記錄對應(yīng)的位置。事實(shí)表外鍵屬性組掃描完畢后生成了分組聚集哈希表和事實(shí)表過濾分組向量。前已述及,非代理鍵的維表主鍵通過動態(tài)轉(zhuǎn)換規(guī)則在訪問時(shí)實(shí)時(shí)映射為代理鍵。圖2顯示了對非代理鍵的維表主鍵進(jìn)行的鍵值轉(zhuǎn)換。維表date的主鍵不是標(biāo)準(zhǔn)的代理鍵,通用的方法是為維表date增加一個(gè)代理鍵dateid_s代替原始的主鍵dateid。對事實(shí)表中的外鍵orderdate可以采用兩種方式一是直接將原始的外鍵更新為新的代理鍵值;二是在事實(shí)表中增加一個(gè)新的代理外鍵列,并按原始的外鍵屬性值來更新代理外鍵orderdate_s列。這種轉(zhuǎn)換過程需要在較小的維表和較大的事實(shí)表中都增加一個(gè)附加列,并通過表間連接操作完成事實(shí)表外鍵列上的數(shù)據(jù)更新。列存儲保證了附加列的存儲和更新具有較高的I/O效率。轉(zhuǎn)換之后的外鍵屬性值代表了與其具有連接關(guān)系的維表記錄的偏移位置,可以映射為內(nèi)存維屬性向量的下標(biāo),并實(shí)現(xiàn)通過外鍵屬性值直接訪問維屬性數(shù)據(jù)項(xiàng)。在本發(fā)明中,對度量屬性的聚集處理采用一趟列掃描的方式能夠保證列存儲數(shù)據(jù)的順序訪問,具有最佳的I/o性能,但需要保證事實(shí)表過濾分組向量駐留內(nèi)存并需要按聚集函數(shù)的數(shù)量對多個(gè)度量屬性列進(jìn)行掃描。為此,本發(fā)明提供了另外一種實(shí)現(xiàn)方案,即通過列存儲數(shù)據(jù)庫所提供的行訪問接口(由數(shù)據(jù)庫將來自多個(gè)查詢相關(guān)列的數(shù)據(jù)動態(tài)轉(zhuǎn)換為行記錄)實(shí)現(xiàn)行訪問模式的⑶DTA-JOIN查詢處理。具體說明如下圖3顯示了行訪問模式下的⑶DTA-JOIN查詢處理過程。首先按行方式訪問查詢相關(guān)的外鍵屬性組 lo_custkey, lo_suppkey, lo_orderdate, lo_revenue, lo_orders,完成根據(jù)維表謂詞向量的連接過濾操作。對于滿足過濾條件的記錄,直接從維表分組屬性向量中抽取分組屬性值,并與聚集函數(shù)表達(dá)式的結(jié)果組合為查詢結(jié)果記錄,推入到分組聚集哈希表中完成分組聚集計(jì)算。行訪問模式下的⑶DTA-JOIN查詢處理不需要預(yù)生成分組聚集哈希表和事實(shí)表過濾分組向量,消除了聚集計(jì)算時(shí)對事實(shí)表過濾分組向量的多次掃描,但行訪問模式需要數(shù)據(jù)庫將列數(shù)據(jù)在緩存中轉(zhuǎn)換為行數(shù)據(jù),對多個(gè)屬性的訪問導(dǎo)致磁盤中較多的隨機(jī)訪問操作,對低選擇率的度量屬性也不能做到按位置訪問,從而使I/O性能受到一定影響。
另外,當(dāng)外部存儲器采用具有并行I/O能力的存儲設(shè)備,例如RAID磁盤陣列、SSD固態(tài)硬盤等設(shè)備時(shí),可以通過并行I/o訪問性能支持并行⑶DTA-JOIN查詢處理過程。圖4顯示了當(dāng)查詢處理過程中包含多個(gè)聚集函數(shù)時(shí)的并行⑶DTA-JOIN查詢處理過程首先通過對事實(shí)表外鍵屬性組的掃描、謂詞向量過濾和預(yù)哈希分組聚集創(chuàng)建事實(shí)表過濾分組向量;接下來,為每一個(gè)聚集函數(shù)創(chuàng)建一個(gè)聚集處理線程,在線程內(nèi)創(chuàng)建各自的分組聚集累加器數(shù)組,通過共享訪問事實(shí)表過濾分組向量的方式按位置訪問度量屬性列并進(jìn)行聚集計(jì)算;各聚集處理線程處理完畢后,將每個(gè)聚集處理線程獨(dú)立的分組聚集累加器與預(yù)分組聚集哈希表合并為查詢聚集結(jié)果集。上述面向多聚集函數(shù)的多核并行計(jì)算對應(yīng)于聚集計(jì)算屬性較多或不可分布式聚集計(jì)算函數(shù)(如中位數(shù)、百分位聚集函數(shù)、TOP k函數(shù)等)的應(yīng)用場景,即通過多核并行技術(shù)為每一個(gè)聚集函數(shù)分配一個(gè)專用的處理線程,實(shí)現(xiàn)并行的聚集計(jì)算。在OLAP查詢處理過程中,如果查詢中包含多個(gè)可分布式聚集函數(shù)時(shí),依次通過掃描事實(shí)表的連接結(jié)果向量的方式處理每個(gè)聚集函數(shù)。具體而言,當(dāng)查詢中包含多個(gè)可分布式聚集函數(shù)時(shí),可以為每一個(gè)聚集函數(shù)分配一個(gè)聚集處理線程,各個(gè)聚集處理線程共享訪問事實(shí)表連接結(jié)果向量,并獨(dú)立地訪問聚集函數(shù)對應(yīng)的事實(shí)表度量屬性列,將分組聚集結(jié)果更新到每個(gè)聚集函數(shù)對應(yīng)的分組聚集累加器中,以便完成度量列上的聚集計(jì)算,并最終合并為全局查詢處理結(jié)果。當(dāng)查詢處理過程中包含較少的可分布式聚集函數(shù)時(shí),通過將事實(shí)表水平分片的方式為每一個(gè)線程分配一個(gè)事實(shí)表分片,并行掃描事實(shí)表分片,通過本發(fā)明所提供的CDDTA-JOIN方法共享訪問謂詞向量和維表分組屬性列,每個(gè)事實(shí)表分片維護(hù)自己私有的分組聚集哈希表,并在各自的事實(shí)表分片上獨(dú)立地完成查詢處理任務(wù),最后將各個(gè)事實(shí)表分片的查詢結(jié)果子集合并為全局查詢結(jié)果。當(dāng)查詢處理過程中包含不可分布聚集函數(shù)和分組操作時(shí),以中位數(shù)聚集函數(shù)為例,首先為每一個(gè)分組ID分配一個(gè)處理線程,在掃描事實(shí)表連接結(jié)果向量時(shí)按哈希分組ID將度量屬性上滿足過濾條件的數(shù)據(jù)分配給對應(yīng)的處理線程,由各個(gè)處理線程獨(dú)立地完成中位數(shù)聚集計(jì)算,并將中位數(shù)結(jié)果記錄在分組聚集累加器數(shù)組對應(yīng)ID的單元中。圖5顯示了采用事實(shí)表水平分片模式的并行⑶DTA-JOIN查詢處理過程。其中,事實(shí)表被水平劃分為多個(gè)物理分片,每個(gè)物理分片分配一個(gè)查詢處理線程;在每個(gè)并行的查詢處理線程內(nèi),執(zhí)行基于行訪問模式的CDDTA-J0IN方法(參考圖3所示);謂詞向量和分組維屬性向量被各個(gè)查詢處理線程共享訪問,每個(gè)查詢處理線程獨(dú)立地執(zhí)行分組聚集計(jì)算;最后將、各個(gè)查詢處理線程的分組聚集結(jié)果歸并為全局分組聚集結(jié)果。面向事實(shí)表水平分片的多核并行計(jì)算對應(yīng)于可分布式聚集計(jì)算函數(shù)(如累加、計(jì)數(shù)、均值、方差等),即將事實(shí)表水平劃分為多個(gè)分片,每個(gè)列存儲水平分片完成獨(dú)立的并行OLAP處理,并由全局OLAP處理線程實(shí)現(xiàn)對各個(gè)水平分片聚集結(jié)果集的歸并計(jì)算。對于可分布式計(jì)算聚集函數(shù),為每個(gè)聚集函數(shù)分配一個(gè)處理線程,各處理線程共享訪問連接結(jié)果向量并將分組聚集結(jié)果更新到每個(gè)聚集函數(shù)對應(yīng)的分組聚集累加器中。對于不可分布式計(jì)算聚集函數(shù),為每一個(gè)聚集函數(shù)(一個(gè)聚集函數(shù)可能對應(yīng)一個(gè)或多個(gè)度量屬性)的分組分配一個(gè)處理線程,每個(gè)處理線程并行地執(zhí)行集中式聚集計(jì)算,并將最終的聚集計(jì)算結(jié)果更新到分組聚集累加器數(shù)組相應(yīng)的單元中。圖6顯示了對于不可分布聚集函數(shù),以中位數(shù)聚集函數(shù)為例的多核并行處理過程,具體操作步驟如下首先通過對事實(shí)表外鍵屬性組的掃描、謂詞向量過濾和預(yù)哈希分組聚集創(chuàng)建事實(shí)表過濾分組向量;
根據(jù)事實(shí)表過濾分組向量的分組ID將讀取的事實(shí)表度量屬性劃分為多個(gè)分組數(shù)據(jù)集;為每個(gè)分組數(shù)據(jù)集分配一個(gè)處理線程;在每個(gè)處理線程內(nèi)獨(dú)立地執(zhí)行中位數(shù)聚集計(jì)算,對分組數(shù)據(jù)排序后計(jì)算中位的結(jié)果;各處理線程執(zhí)行完畢后,將各線程的中位數(shù)結(jié)果復(fù)制到分組聚集哈希表中對應(yīng)的聚集結(jié)果單元,完成全局聚集計(jì)算。以上對本發(fā)明所提供的面向列存儲數(shù)據(jù)倉庫的多維OLAP查詢處理方法進(jìn)行了詳細(xì)的說明。對本領(lǐng)域的技術(shù)人員而言,在不背離本發(fā)明實(shí)質(zhì)精神的前提下對它所做的任何顯而易見的改動,都將構(gòu)成對本發(fā)明專利權(quán)的侵犯,將承擔(dān)相應(yīng)的法律責(zé)任。
權(quán)利要求
1.一種面向列存儲數(shù)據(jù)倉庫的多維OLAP查詢處理方法,將OLAP查詢分解為位圖過濾操作、分組操作和聚集操作,事實(shí)表和維表采用列存儲模型進(jìn)行存儲,其特征在于 在位圖過濾操作中,首先將謂詞在維表上執(zhí)行并生成謂詞向量位圖,通過代理鍵地址映射將連接操作轉(zhuǎn)換為直接維表記錄訪問操作,實(shí)現(xiàn)按位置進(jìn)行訪問; 在分組操作中,將滿足過濾條件的事實(shí)表記錄按SQL命令中的分組屬性預(yù)生成分組單元并分配遞增的ID ; 在聚集操作中,通過對事實(shí)表度量屬性的一趟列掃描實(shí)現(xiàn)按事實(shí)表分組過濾向量的分組項(xiàng)進(jìn)行分組聚集計(jì)算。
2.如權(quán)利要求I所述的面向列存儲數(shù)據(jù)倉庫的多維OLAP查詢處理方法,其特征在于 將維屬性列加載到內(nèi)存形成內(nèi)存維屬性數(shù)組,所述主鍵對應(yīng)所述內(nèi)存維屬性數(shù)組的下標(biāo); 事實(shí)表記錄的外鍵屬性值映射為對應(yīng)維表中內(nèi)存維屬性數(shù)組的下標(biāo); 所述事實(shí)表和所述維表通過外鍵與主鍵的對應(yīng)關(guān)系完成多表連接過濾操作。
3.如權(quán)利要求I所述的面向列存儲數(shù)據(jù)倉庫的多維OLAP查詢處理方法,其特征在于 當(dāng)內(nèi)存不能容納全部維表時(shí),將查詢處理中需要訪問的維表分組屬性列加載入內(nèi)存形成內(nèi)存維向量,在維表上進(jìn)行謂詞操作,將謂詞操作結(jié)果存儲在一個(gè)與維表等長的位圖中,作為謂詞向量來記錄每一個(gè)維表記錄對謂詞操作結(jié)果的滿足狀態(tài)。
4.如權(quán)利要求I所述的面向列存儲數(shù)據(jù)倉庫的多維OLAP查詢處理方法,其特征在于 預(yù)創(chuàng)建分組聚集哈希表和事實(shí)表過濾分組向量,所述分組聚集哈希表以查詢中的分組屬性和附加ID為對象進(jìn)行預(yù)創(chuàng)建,所述事實(shí)表過濾分組向量為與事實(shí)表等長的數(shù)值型向量。
5.如權(quán)利要求I所述的面向列存儲數(shù)據(jù)倉庫的多維OLAP查詢處理方法,其特征在于 順序掃描事實(shí)表中具有維表連接關(guān)系的外鍵屬性組,讀取每一條外鍵屬性組記錄,將事實(shí)表外鍵屬性值直接映射為謂詞向量下標(biāo)并取出謂詞向量中該位所記錄的位數(shù)據(jù)進(jìn)行與操作; 如果位運(yùn)算結(jié)果為假,則繼續(xù)讀取下一條外鍵屬性組記錄;如果位運(yùn)算結(jié)果為真,則將各個(gè)外鍵的值映射為維表分組屬性向量的下標(biāo)。
6.如權(quán)利要求I所述的面向列存儲數(shù)據(jù)倉庫的多維OLAP查詢處理方法,其特征在于 抽取分組維屬性向量中指定的數(shù)據(jù)項(xiàng)后進(jìn)行哈希分組;如果當(dāng)前哈希鍵值已存在,則取出該哈希分組ID并記入事實(shí)表過濾分組向量中與當(dāng)前事實(shí)表記錄相對應(yīng)的位置中;如果當(dāng)前哈希鍵值不存在,貝1J在分組哈希表中創(chuàng)建一個(gè)新的哈希分組,并分配遞增的ID,同時(shí)將該哈希分組ID記錄在事實(shí)表連接向量中與當(dāng)前事實(shí)表記錄相應(yīng)的位置上。
7.如權(quán)利要求I所述的面向列存儲數(shù)據(jù)倉庫的多維OLAP查詢處理方法,其特征在于 在事實(shí)表外鍵屬性組掃描完畢后,得到事實(shí)表過濾分組向量和預(yù)設(shè)的分組聚集哈希表,按最大ID值創(chuàng)建聚集函數(shù)的數(shù)組作為分組聚集累加器。
8.如權(quán)利要求7所述的面向列存儲數(shù)據(jù)倉庫的多維OLAP查詢處理方法,其特征在于 當(dāng)在所述事實(shí)表過濾分組向量中掃描到一個(gè)非零數(shù)據(jù)項(xiàng)時(shí),按向量下標(biāo)位置訪問磁盤列存儲的度量屬性,并將度量屬性值送入所述事實(shí)表過濾分組向量中哈希分組ID值與分組聚集累加器數(shù)組對應(yīng)下標(biāo)的單元進(jìn)行聚集計(jì)算。
9.如權(quán)利要求8所述的面向列存儲數(shù)據(jù)倉庫的多維OLAP查詢處理方法,其特征在于 在所有的度量屬性列完成聚集計(jì)算后,將分組聚集哈希表與各分組聚集累加器按ID和數(shù)組下標(biāo)順序進(jìn)行合并,生成最終的OLAP聚集結(jié)果。
10.如權(quán)利要求I所述的面向列存儲數(shù)據(jù)倉庫的多維OLAP查詢處理方法,其特征在于 如果查詢處理過程中包含多個(gè)可分布式聚集函數(shù),依次通過掃描事實(shí)表連接結(jié)果向量的方式處理每個(gè)可分布式聚集函數(shù)。
全文摘要
本發(fā)明公開了一種面向列存儲數(shù)據(jù)倉庫的多維OLAP查詢處理方法。它將OLAP查詢分解為位圖過濾操作、分組操作和聚集操作。在位圖過濾操作中,首先將謂詞在維表上執(zhí)行并生成謂詞向量位圖,通過代理鍵地址映射將連接操作轉(zhuǎn)換為直接維表記錄訪問操作,實(shí)現(xiàn)按位置進(jìn)行訪問;在分組操作中,將滿足過濾條件的事實(shí)表記錄按SQL命令中的分組屬性預(yù)生成分組單元并分配遞增的ID;在聚集操作中,通過對事實(shí)表度量屬性的一趟列掃描實(shí)現(xiàn)按事實(shí)表分組過濾向量的分組項(xiàng)進(jìn)行分組聚集計(jì)算。本發(fā)明只需要對事實(shí)表進(jìn)行一趟列掃描即可完成全部的OLAP處理任務(wù),避免了多次掃描的代價(jià)。
文檔編號G06F17/30GK102663116SQ20121011411
公開日2012年9月12日 申請日期2012年4月17日 優(yōu)先權(quán)日2012年4月11日
發(fā)明者張延松, 王珊 申請人:中國人民大學(xué)