分布式內存列式數(shù)據(jù)庫的索引建立方法【專利摘要】本發(fā)明公開了一種分布式內存列式數(shù)據(jù)庫的索引建立方法,包括:將單列數(shù)據(jù)切分為至少兩個數(shù)據(jù)分片;并行計算每個數(shù)據(jù)分片的列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù),所述列式壓縮索引包括字典向量、索引向量以及位置向量;按序存儲并更新每個數(shù)據(jù)分片的列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù),以形成列式壓縮索引和行表向量。本發(fā)明提供的分布式內存列式數(shù)據(jù)庫的索引建立方法,對于巨表的導入計算節(jié)點并不需要多大的內存,可以節(jié)約硬件成本?!緦@f明】分布式內存列式數(shù)據(jù)庫的索引建立方法
技術領域:
[0001]本發(fā)明涉及數(shù)據(jù)庫
技術領域:
,具體涉及一種分布式內存列式數(shù)據(jù)庫的索引建立方法?!?br>背景技術:
】[0002]Groupkey索引,即列式壓縮索引,是一種在分布式內存列式數(shù)據(jù)庫中的數(shù)據(jù)組織方式,其采用字典壓縮對每列內容進行壓縮,采用索引(index)向量對字典向量中某個值對應的行數(shù)進行索引,采用位置(posit1n)向量存儲字典向量對應的行號(rowid)。同時,有一個行表(rowtable)向量維持行關系,里面存儲的是元素值在字典向量中的下標。為分布式內存列式數(shù)據(jù)庫建立Groupkey索引的傳統(tǒng)方法為:將數(shù)據(jù)從數(shù)據(jù)源中讀入內存;對讀入內存中的數(shù)據(jù)進行排序處理并去重,生成字典向量;根據(jù)排序后的字典向量建立索引向量、位置向量和行表向量;將字典向量、索引向量、位置向量以及行表向量發(fā)送給存儲節(jié)點,Groupkey索引建立完成。[0003]由于需要將所有數(shù)據(jù)讀入內存后開始排序,現(xiàn)有最快的快速排序算法的時間復雜度也是O(NlogN)。另一方面,在Groupkey索引的建立過程中,向量是沒有進行位壓縮的。以一個2~30行(約10億行)的double類型為列,字典壓縮后的數(shù)據(jù)大小是原始數(shù)據(jù)大小的μ倍(0<μ<D0原始數(shù)據(jù)大小為:2~30X8byte;字典向量所占用的內存大小為:μX2~30X8byte;索引向量所占用的內存大小為:μX2~30X8byte;位置向量所占用的內存大小為:2~30X8byte;行表向量所占用的內存大小為:2■'30X8byte??偣埠馁M的內存至少為:(16μ+24)Gb,而原始數(shù)據(jù)大小為:8Gb,導入的內存倍數(shù)為:2μ+3倍。如果μ為I(也就是說原始數(shù)據(jù)中數(shù)據(jù)沒有重復),內存的消耗是原始數(shù)據(jù)大小的5倍。[0004]并且,上述計算是基于采用STL中的vector形式存儲數(shù)據(jù)。采用vector形式存儲數(shù)據(jù),內存需要是連續(xù)的才能夠分配成功,因而需要更加大的內存。如果不采用vector形式存儲數(shù)據(jù),采用鏈表等其他形式還會有指針開銷,此時的內存消耗會更大。綜上所述,采用傳統(tǒng)方式建立Groupkey索引無論在時間上還是空間上都存在瓶頸,對于巨表的導入無能為力。其中,巨表為單列大小超過節(jié)點內存的表。[0005]為了縮短建立Groupkey索引的時間,現(xiàn)有技術中采用多線程排序。該方法利用多核可以顯著提高字典排序的速度,然而內存消耗大的問題依然無法解決?!?br/>發(fā)明內容】[0006]本發(fā)明所要解決的是建立分布式內存列式數(shù)據(jù)庫的Groupkey索引內存消耗大的問題。[0007]本發(fā)明通過下述技術方案實現(xiàn):一種分布式內存列式數(shù)據(jù)庫的索引建立方法,包括:將單列數(shù)據(jù)切分為至少兩個數(shù)據(jù)分片;并行計算每個數(shù)據(jù)分片的列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù),所述列式壓縮索引包括字典向量、索引向量以及位置向量;按序存儲并更新每個數(shù)據(jù)分片的列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù),以形成列式壓縮索引和行表向量。[0008]本發(fā)明采用分布式并行導入思想,一方面,并行計算每個數(shù)據(jù)分片的列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù)保證了計算列式壓縮索引和行表向量的效率;另一方面,每個數(shù)據(jù)分片的列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù)由不同的計算節(jié)點進行計算,也就是說每個計算節(jié)點只會拿到列數(shù)據(jù)中的一個數(shù)據(jù)分片,因而計算節(jié)點并不需要裝下整個列數(shù)據(jù),能夠實現(xiàn)在計算節(jié)點內存較小的情況下,依然能夠對任意巨表的導入以及快速建立索引。進一步,本發(fā)明采用分布式集群架構具有拓展性,只需要通過增加計算節(jié)點的個數(shù),就可提升導入性能。[0009]可選的,所述分布式內存列式數(shù)據(jù)庫包括域控制器、讀取組件、存儲節(jié)點、主數(shù)據(jù)服務器以及至少兩個從數(shù)據(jù)服務器。[0010]可選的,將單列數(shù)據(jù)切分為至少兩個數(shù)據(jù)分片包括:域控制器下發(fā)列數(shù)據(jù)導入任務至主數(shù)據(jù)服務器;主數(shù)據(jù)服務器將列數(shù)據(jù)導入任務切分成子任務后下發(fā)給各個從數(shù)據(jù)服務器,子任務和從數(shù)據(jù)服務器一一對應;各個從數(shù)據(jù)服務器根據(jù)子任務向讀取組件下發(fā)導入任務;讀取組件根據(jù)導入任務向各個從數(shù)據(jù)服務器上傳數(shù)據(jù)分片。[0011]可選的,主數(shù)據(jù)服務器根據(jù)各個從數(shù)據(jù)服務器報告的內存大小下發(fā)子任務。通過內存大小下發(fā)子任務,內存較大的從數(shù)據(jù)服務器計算的數(shù)據(jù)分片更大,能夠合理分配系統(tǒng)資源。[0012]可選的,并行計算每個數(shù)據(jù)分片的列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù)包括:各個從數(shù)據(jù)服務器并行計算其自身對應的數(shù)據(jù)分片的列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù)。[0013]可選的,按序存儲并更新每個數(shù)據(jù)分片的列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù)包括:從數(shù)據(jù)服務器計算列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù)完成后,向主數(shù)據(jù)服務器發(fā)送準備就緒信號;若主數(shù)據(jù)服務器為首次接收準備就緒信號,則執(zhí)行第一步驟,否則執(zhí)行第二步驟,其中,第一步驟包括:主數(shù)據(jù)服務器向從數(shù)據(jù)服務器下發(fā)分片任務;從數(shù)據(jù)服務器對列式壓縮索引的中間數(shù)據(jù)進行切分以形成索引分片,并將索引分片和行表向量的中間數(shù)據(jù)導入存儲節(jié)點;導入完成后存儲節(jié)點向從數(shù)據(jù)服務器發(fā)送確認消息;第二步驟包括:主數(shù)據(jù)服務器向從數(shù)據(jù)服務器下發(fā)分片任務和上一次分片結果;從數(shù)據(jù)服務器根據(jù)上一次分片結果對列式壓縮索引的中間數(shù)據(jù)進行切分以形成索引分片,并將索引分片和行表向量的中間數(shù)據(jù)導入存儲節(jié)點;存儲節(jié)點將字典向量新增元素個數(shù)、已導入的字典向量的偏移量以及新導入的字典向量的偏移量告知從數(shù)據(jù)服務器;從數(shù)據(jù)服務器根據(jù)字典向量新增元素個數(shù)、已導入的字典向量的偏移量以及新導入的字典向量的偏移量更新全局字典向量的起始下標和行表向量;更新完成后存儲節(jié)點向從數(shù)據(jù)服務器發(fā)送確認消息;從數(shù)據(jù)服務器在接收到所有存儲節(jié)點發(fā)送的確認消息后,向主數(shù)據(jù)服務器匯報當前數(shù)據(jù)分片導入完成;若當前數(shù)據(jù)分片為最后導入的數(shù)據(jù)分片,則列數(shù)據(jù)導入完成,否則重復執(zhí)行第二步驟。[0014]對列式壓縮索引的中間數(shù)據(jù)進行切分后,可以將一個大的列式壓縮索引的中間數(shù)據(jù)散列到底層的分布式存儲節(jié)點中。從存儲硬件條件出發(fā),在大規(guī)模數(shù)據(jù)庫中,一個存儲節(jié)點將不能夠全部裝下整個列的索引,通過將列式壓縮索引的中間數(shù)據(jù)散列,可以通過簡單的增加機器的方法,放下更大的表;從查詢效率出發(fā),將列式壓縮索引的中間數(shù)據(jù)進行切分,可以充分利用存儲節(jié)點的CPU核數(shù),讓一個線程計算一個索引分片,提高并行度。另一方面,從數(shù)據(jù)服務器根據(jù)上一次分片結果對列式壓縮索引的中間數(shù)據(jù)進行切分,可以維持列式壓縮索引的中間數(shù)據(jù)在建立好后依然是有序的,同一個區(qū)間范圍內的數(shù)據(jù)依然能夠落在一個區(qū)間范圍內,避免字典向量中的會出現(xiàn)交疊。[0015]可選的,所述存儲節(jié)點包括行表存儲節(jié)點和至少一個索引存儲節(jié)點;索引存儲節(jié)點用于存儲索引分片;行表存儲節(jié)點用于存儲行表向量的中間數(shù)據(jù)。[0016]可選的,所述上一次分片結果包括上一個列式壓縮索引的中間數(shù)據(jù)對應的存儲節(jié)點地址、索引分片上界以及索引分片下界。[0017]可選的,在第二步驟中,從數(shù)據(jù)服務器將落在同一個區(qū)間內的字典向量中的元素切分在同一個索引分片。[0018]可選的,更新全局字典向量的起始下標包括:疊加當前索引分片之前所有索引分片的字典向量新增元素個數(shù)以獲得當前索引分片對應于全局字典向量的起始下標,第一個索引分片對應于全局字典向量的起始下標為O;更新行表向量包括:將每個索引分片已導入的字典向量的偏移量中每個元素加上上一個索引分片字典向量新增元素個數(shù),并拼接所有索引分片已導入的字典向量的偏移量以獲得全局已導入的字典向量的偏移量;將每個索引分片新導入的字典向量的偏移量中每個元素加上上一個索引分片字典向量新增元素個數(shù),并拼接所有索引分片新導入的字典向量的偏移量以獲得全局新導入的字典向量的偏移量;將從數(shù)據(jù)服務器中行表向量的第i位元素與全局新導入的字典向量的偏移量的第rowtable[i]位元素相加以獲得第一更新行表向量,其中,i為自然數(shù),rowtable[i]為從數(shù)據(jù)服務器中行表向量的第i位元素的值;從數(shù)據(jù)服務器將全局已導入的字典向量的偏移量和第一更新行表向量發(fā)送至存儲節(jié)點;將存儲節(jié)點中行表向量的第j位元素與全局已導入的字典向量的偏移量的第rowtable[j]位元素相加以獲得第二更新行表向量,其中,j為自然數(shù),rowtabIe[j]為存儲節(jié)點中行表向量的第j位元素的值;將第一更新行表向量追加到第二更新行表向量之后。[0019]本發(fā)明與現(xiàn)有技術相比,具有如下的優(yōu)點和有益效果:本發(fā)明提供的分布式內存列式數(shù)據(jù)庫的索引建立方法,將列數(shù)據(jù)切分后再進行導入,因而對于巨表的導入計算節(jié)點并不需要多大的內存,可以節(jié)約硬件成本。計算列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù)過程采用并行方式處理,顯著提高了列數(shù)據(jù)導入和索引建立效率。進一步,各個計算節(jié)點相互獨立,通過簡單增加計算節(jié)點就可以提高列數(shù)據(jù)導入能力,滿足不斷擴展的業(yè)務需求?!靖綀D說明】[0020]此處所說明的附圖用來提供對本發(fā)明實施例的進一步理解,構成本申請的一部分,并不構成對本發(fā)明實施例的限定。在附圖中:圖1是本發(fā)明實施例涉及的分布式內存列式數(shù)據(jù)庫的結構示意圖;圖2是本發(fā)明實施例各個從數(shù)據(jù)服務器并行建立Groupkey索引的中間數(shù)據(jù)的示意圖;圖3是本發(fā)明實施例首個從數(shù)據(jù)服務器進行分片的示意圖;圖4是本發(fā)明實施例非首個從數(shù)據(jù)服務器進行分片的示意圖;圖5是本發(fā)明實施例從數(shù)據(jù)服務器對字典向量、索引向量以及位置向量進行更新的示意圖;圖6是本發(fā)明實施例對行表向量進行更新的示意圖;圖7是本發(fā)明實施例進行分片后的最終結果示意圖?!揪唧w實施方式】[0021]Groupkey索引建立過程中最耗費時間的是建立字典向量的過程,而建立字典向量的過程實際上是一個排序和去重的過程。如果將整個列數(shù)據(jù)都導入到內存中后再建立字典向量將需要大量內存,且排序的過程會浪費太多時間,其時間復雜度是O(1gN)。對于傳統(tǒng)Groupkey索引的使用來說,Groupkey的更新主要用于有新的數(shù)據(jù)到來后才啟用。Groupkey索引的建立過程是O(1gN)時間復雜度,而更新流程是O(N)時間復雜度。[0022]基于此,本發(fā)明提供一種分布式內存列式數(shù)據(jù)庫的索引建立方法,將需要導入的巨表進行切分,分別在不同的計算節(jié)點上面進行Groupkey索引的建立,也就是將O(1gN)復雜度的過程并行處理,最后將計算好的Groupkey索引再進行更新操作。使導入性能成倍增長,需要的內存成倍縮減。[0023]所述分布式內存列式數(shù)據(jù)庫的索引建立方法,包括:步驟SI,將單列數(shù)據(jù)切分為至少兩個數(shù)據(jù)分片;步驟S2,并行計算每個數(shù)據(jù)分片的列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù),所述列式壓縮索引包括字典向量、索引向量以及位置向量;步驟S3,按序存儲并更新每個數(shù)據(jù)分片的列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù),以形成列式壓縮索引和行表向量。[0024]為使本發(fā)明的目的、技術方案和優(yōu)點更加清楚明白,下面結合實施例和附圖,對本發(fā)明作進一步的詳細說明,本發(fā)明的示意性實施方式及其說明僅用于解釋本發(fā)明,并不作為對本發(fā)明的限定。實施例[0025]圖1是本實施例涉及的分布式內存列式數(shù)據(jù)庫的結構示意圖,所述分布式內存列式數(shù)據(jù)庫包括域控制器DC(DomainController)、索引服務器IS(IndexServer)、數(shù)據(jù)導入管理模塊IM(ImportManager)、內存數(shù)據(jù)庫引擎MDE(InMemoryDatabaseEngine)、存儲節(jié)點CS(ColumnStore)、數(shù)據(jù)導入系統(tǒng)DIS(DataImportSystem)、數(shù)據(jù)服務器DS以及讀取組件RA(RepliCat1nAgent)。其中,域控制器DC負責對數(shù)據(jù)服務器DS下發(fā)數(shù)據(jù)導入任務;存儲節(jié)點CS為內存數(shù)據(jù)庫引擎中存儲數(shù)據(jù)的服務節(jié)點,負責存儲數(shù)據(jù)和對上層提供查詢的功能,其包括行表存儲節(jié)點rowtableCS和至少一個索引存儲節(jié)點columnCS;數(shù)據(jù)服務器DS為數(shù)據(jù)導入系統(tǒng)DIS中的數(shù)據(jù)導入模塊,負責將源數(shù)據(jù)導入內存數(shù)據(jù)庫引擎MDE中,其包括主數(shù)據(jù)服務器和至少一個從數(shù)據(jù)服務器;讀取組件RA為數(shù)據(jù)庫訪問的接口,用于外部數(shù)據(jù)源的適配與數(shù)據(jù)的讀取,與Oracle數(shù)據(jù)庫在同一節(jié)點上;索引服務器IS為內存數(shù)據(jù)庫引擎MDE的控制節(jié)點;數(shù)據(jù)導入管理模塊頂用于負責管理源數(shù)據(jù)導入整個流程。[0026]如步驟SI所述,將單列數(shù)據(jù)切分為至少兩個數(shù)據(jù)分片。具體地,域控制器DC下發(fā)列數(shù)據(jù)導入任務至主數(shù)據(jù)服務器;主數(shù)據(jù)服務器將列數(shù)據(jù)導入任務切分成子任務后下發(fā)給各個從數(shù)據(jù)服務器,每個子任務為導入一個數(shù)據(jù)分片且子任務和從數(shù)據(jù)服務器一一對應,即給每個從數(shù)據(jù)服務器下發(fā)一個子任務,在本實施例中,主數(shù)據(jù)服務器根據(jù)各個從數(shù)據(jù)服務器報告的內存大小下發(fā)子任務,內存越大的從數(shù)據(jù)服務器獲得的子任務所需內存越大,如此能夠合理分配系統(tǒng)資源;各個從數(shù)據(jù)服務器根據(jù)子任務向讀取組件RA下發(fā)導入任務;讀取組件RA根據(jù)導入任務向各個從數(shù)據(jù)服務器上傳數(shù)據(jù)分片。[0027]如步驟S2所述,并行計算每個數(shù)據(jù)分片的列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù),所述列式壓縮索引包括字典向量、索引向量以及位置向量。各個從數(shù)據(jù)服務器并行計算其自身對應的數(shù)據(jù)分片的列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù),即同時計算每個數(shù)據(jù)分片的Groupkey向量和行表向量。[0028]如步驟S3所述,按序存儲并更新每個數(shù)據(jù)分片的列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù),以形成列式壓縮索引和行表向量。具體地,從數(shù)據(jù)服務器計算列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù)完成后,就向主數(shù)據(jù)服務器發(fā)送準備就緒信號。若主數(shù)據(jù)服務器為首次接收準備就緒信號,即發(fā)送準備就緒信號的從數(shù)據(jù)服務器是第一個向主數(shù)據(jù)服務器發(fā)送的,則執(zhí)行第一步驟,否則執(zhí)行第二步驟。[0029]其中,第一步驟包括:主數(shù)據(jù)服務器向從數(shù)據(jù)服務器下發(fā)分片任務;從數(shù)據(jù)服務器對列式壓縮索引的中間數(shù)據(jù)進行切分以形成索引分片,即對字典向量、索引向量以及位置向量進行切分,并將索引分片和行表向量導入存儲節(jié)點CS,進一步,是將索引分片導入索引存儲節(jié)點columnCS,將行表向量的中間數(shù)據(jù)導入行表存儲節(jié)點rowtableCS;導入完成后存儲節(jié)點向從數(shù)據(jù)服務器發(fā)送確認消息ACK。[0030]第二步驟包括:主數(shù)據(jù)服務器向從數(shù)據(jù)服務器下發(fā)分片任務和上一次分片結果,所述上一次分片結果包括上一個列式壓縮索引的中間數(shù)據(jù)對應的存儲節(jié)點地址、索引分片上界以及索引分片下界;從數(shù)據(jù)服務器根據(jù)上一次分片結果對列式壓縮索引的中間數(shù)據(jù)進行切分以形成索引分片,并將索引分片和行表向量的中間數(shù)據(jù)導入存儲節(jié)點CS,進一步,是將索引分片導入索引存儲節(jié)點columnCS,將行表向量的中間數(shù)據(jù)導入行表存儲節(jié)點rowtableCS;索引存儲節(jié)點columnCS將字典向量新增元素個數(shù)、已導入的字典向量的偏移量以及新導入的字典向量的偏移量告知從數(shù)據(jù)服務器;從數(shù)據(jù)服務器根據(jù)字典向量新增元素個數(shù)、已導入的字典向量的偏移量以及新導入的字典向量的偏移量更新全局字典向量的起始下標和行表向量;更新完成后存儲節(jié)點向從數(shù)據(jù)服務器發(fā)送確認消息ACK。進一步,在第二步驟中,從數(shù)據(jù)服務器根據(jù)上一次分片結果對列式壓縮索引的中間數(shù)據(jù)進行切分,因此,每個從數(shù)據(jù)服務器在生成索引分片的同時也生成分片結果,并將分片結果告知主數(shù)據(jù)服務器。在當前從數(shù)據(jù)服務器進行分片時,主數(shù)據(jù)服務器將上一次分片結果下發(fā)給當前從數(shù)據(jù)服務器。當前從數(shù)據(jù)服務器的分片規(guī)則是,將落在同一個區(qū)間內的字典向量中的元素切分在同一個索引分片。[0031]在第一步驟或者第二步驟完成,從數(shù)據(jù)服務器在接收到所有存儲節(jié)點發(fā)送的確認消息ACK后,向主數(shù)據(jù)服務器匯報當前數(shù)據(jù)分片導入完成。若當前數(shù)據(jù)分片為最后導入的數(shù)據(jù)分片,則列數(shù)據(jù)導入完成,否則重復執(zhí)行第二步驟。[0032]以下以導入圖2所示的原始數(shù)據(jù)并建立索引為例說明本實施例的具體流程,其中,UM是列式壓縮索引中的字典向量,Index是列式壓縮索引中的索引向量,posit1n是列式壓縮索引中的位置向量,rowtable是列式壓縮索引中的行表向量。原始數(shù)據(jù)被切分為三個數(shù)據(jù)分片,第一個數(shù)據(jù)分片包括數(shù)據(jù)E、1、C、E,第二個數(shù)據(jù)分片包括數(shù)據(jù)H、1、B、Y,第三個數(shù)據(jù)分片包括數(shù)據(jù)K、J、Z。第一個數(shù)據(jù)分片由從數(shù)據(jù)服務器I負責計算,第二個數(shù)據(jù)分片由從數(shù)據(jù)服務器2負責計算,第三個數(shù)據(jù)分片由從數(shù)據(jù)服務器3負責計算。[0033]首先,每個從數(shù)據(jù)服務器將收到的每個數(shù)據(jù)分片建立列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù),這個過程是并行的,如圖2所示。當一個從數(shù)據(jù)服務器建立好了列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù)后,將會發(fā)送準備就緒信號給主數(shù)據(jù)服務器。假如此刻是從數(shù)據(jù)服務器2,即從數(shù)據(jù)服務器2是第一個告知主從數(shù)據(jù)服務器它的列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù)準備就緒的從數(shù)據(jù)服務器,該從數(shù)據(jù)服務器根據(jù)自己列式壓縮索引的中間數(shù)據(jù)生成分片結果,并將索引分片下發(fā)給存儲節(jié)點,同時將分片結果告知主數(shù)據(jù)服務器,如圖3所示。其中,索引分片I下發(fā)給索引存儲節(jié)點columnCSl,索引分片2下發(fā)給索引存儲節(jié)點columnCS2,行表向量下發(fā)給行表存儲節(jié)點rowtableCS。分片結果為:〈columnCSl,B,H>,〈columnCS2,I,Y>。[0034]數(shù)據(jù)分片2導入成功后,主數(shù)據(jù)服務器從準備就緒的從數(shù)據(jù)服務器中選擇一個,向其下發(fā)數(shù)據(jù)分片2的分片結果。假設此時被選中的是從數(shù)據(jù)服務器I,則從數(shù)據(jù)服務器I根據(jù)數(shù)據(jù)分片2的分片結果將數(shù)據(jù)分片I的列式壓縮索引的中間數(shù)據(jù)分片。此時的分片規(guī)則是,落在同一個區(qū)間內的字典向量中的元素切分在同一個索引分片,如圖4所示。[0035]此時,索引存儲節(jié)點columnCSl和索引存儲節(jié)點columnCS2都會收到索引分片的到達,索引存儲節(jié)點columnCSl和索引存儲節(jié)點columnCS2會根據(jù)自己原有的索引分片和新到達的索引分片,計算出每個索引分片字典向量新增元素個數(shù)expand、已導入的字典向量的偏移量main_x_vector和新導入的字典向量的偏移量delta_x_vector,并將此信息報告給從數(shù)據(jù)服務器I,如圖5所示。[0036]從數(shù)據(jù)服務器I通過接收每個索引分片字典向量新增元素個數(shù)expand計算出更新后的對應于全局字典向量的起始下標beginentry,并發(fā)送給索引存儲節(jié)點columnCSl和索引存儲節(jié)點columnCS2。更新后的對應于全局字典向量的起始下標beginentry的計算方式是疊加當前索引分片之前所有索引分片的字典向量新增元素個數(shù)expand以獲得當前索引分片對應于全局字典向量的起始下標,第一個索引分片更新后的對應于全局字典向量的起始下標beginentry為O。同時,從數(shù)據(jù)服務器I通過接收已導入的字典向量的偏移量main_x_vector和新導入的字典向量的偏移量delta_x_vector來計算全局的已導入的字典向量的偏移量和全局的新導入的字典向量的偏移量。對于存儲節(jié)點columnCSl,字典向量新增元素個數(shù)expand為兩個,已導入的字典向量的偏移量main_x_vector為[0,2],新導入的字典向量的偏移量delta_x_vector為[I,I];對于存儲節(jié)點columnCS2,字典向量新增元素個數(shù)expand為兩個,已導入的字典向量的偏移量main_x_vector為[0,0],新導入的字典向量的偏移量delta_x_vector為[0]。[0037]計算全局已導入的字典向量的偏移量的偏移量具體過程為:將每個索引分片已導入的字典向量的偏移量main_x_vector中每個元素加上上一個索引分片字典向量新增元素個數(shù)expand(第一個索引分片除外),然后將所有索引分片已導入的字典向量的偏移量main_x_vector拼接在一起。計算全局新導入的字典向量的偏移量的偏移量具體過程為:將每個索引分片新導入的字典向量的偏移量delta_x_vector中每個元素加上上一個索引分片字典向量新增元素個數(shù)expand(第一個索引分片除外),然后將所有索引分片新導入的字典向量的偏移量delta_x_vector拼接在一起。[0038]然后,從數(shù)據(jù)服務器I根據(jù)全局新導入的字典向量的偏移量進行行表向量的更新。更新的辦法是,將從數(shù)據(jù)服務器上面的行表向量中的第i位元素rowtable[i](i從O開始)與全局新導入的字典向量的偏移量中第rowtable[i]位元素delta_x_vector[rowtable[i]]相加,得到第一更新行表向量rowtable’中第i位元素的值rowtable’[i],然后將全局已導入的字典向量的偏移量main_x_vector和第一更新行表向量rowtable’發(fā)送給行表存儲節(jié)點rowtableCS。行表存儲節(jié)點rowtableCS收到了全局已導入的字典向量的偏移向量main_x_vector和第一更新行表向量rowtable’后,將行表存儲節(jié)點rowtableCS中原有的行表向量中的第j位元素rowtabIe[j](j從O開始)與全局已導入的字典向量的偏移量的第rowtable[j]位元素1]^;[11_1_¥601:(^[rowtabIe[j]]相加,得到第二更新行表向量rowtable’,中第j位元素的值rowtable’,[j]。將第一更新行表向量rowtable’追加到第二更新行表向量rowtabIe’’之后,行表存儲節(jié)點rowtabIeCS上面的行表向量如圖6所示。[0039]當收到行表存儲節(jié)點rowtableCS和所有索引存儲節(jié)點columnCS的確認消息后,主數(shù)據(jù)服務器再選擇下一個從數(shù)據(jù)服務器,此時為從數(shù)據(jù)服務器3。從數(shù)據(jù)服務器3進行和從數(shù)據(jù)服務器2相同的操作,更新完成后的列式壓縮索引情況和相應的行表向量如圖7所示。[0040]以上所述的【具體實施方式】,對本發(fā)明的目的、技術方案和有益效果進行了進一步詳細說明,所應理解的是,以上所述僅為本發(fā)明的【具體實施方式】而已,并不用于限定本發(fā)明的保護范圍,凡在本發(fā)明的精神和原則之內,所做的任何修改、等同替換、改進等,均應包含在本發(fā)明的保護范圍之內?!局鳈囗棥?.一種分布式內存列式數(shù)據(jù)庫的索引建立方法,其特征在于,包括:將單列數(shù)據(jù)切分為至少兩個數(shù)據(jù)分片;并行計算每個數(shù)據(jù)分片的列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù),所述列式壓縮索引包括字典向量、索引向量以及位置向量;按序存儲并更新每個數(shù)據(jù)分片的列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù),以形成列式壓縮索引和行表向量。2.根據(jù)權利要求1所述的分布式內存列式數(shù)據(jù)庫的索引建立方法,其特征在于,所述分布式內存列式數(shù)據(jù)庫包括域控制器、讀取組件、存儲節(jié)點、主數(shù)據(jù)服務器以及至少兩個從數(shù)據(jù)服務器。3.根據(jù)權利要求2所述的分布式內存列式數(shù)據(jù)庫的索引建立方法,其特征在于,將單列數(shù)據(jù)切分為至少兩個數(shù)據(jù)分片包括:域控制器下發(fā)列數(shù)據(jù)導入任務至主數(shù)據(jù)服務器;主數(shù)據(jù)服務器將列數(shù)據(jù)導入任務切分成子任務后下發(fā)給各個從數(shù)據(jù)服務器,子任務和從數(shù)據(jù)服務器一一對應;各個從數(shù)據(jù)服務器根據(jù)子任務向讀取組件下發(fā)導入任務;讀取組件根據(jù)導入任務向各個從數(shù)據(jù)服務器上傳數(shù)據(jù)分片。4.根據(jù)權利要求3所述的分布式內存列式數(shù)據(jù)庫的索引建立方法,其特征在于,主數(shù)據(jù)服務器根據(jù)各個從數(shù)據(jù)服務器報告的內存大小下發(fā)子任務。5.根據(jù)權利要求2所述的分布式內存列式數(shù)據(jù)庫的索引建立方法,其特征在于,并行計算每個數(shù)據(jù)分片的列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù)包括:各個從數(shù)據(jù)服務器并行計算其自身對應的數(shù)據(jù)分片的列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù)。6.根據(jù)權利要求5所述的分布式內存列式數(shù)據(jù)庫的索引建立方法,其特征在于,按序存儲并更新每個數(shù)據(jù)分片的列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù)包括:從數(shù)據(jù)服務器計算列式壓縮索引的中間數(shù)據(jù)和行表向量的中間數(shù)據(jù)完成后,向主數(shù)據(jù)服務器發(fā)送準備就緒信號;若主數(shù)據(jù)服務器為首次接收準備就緒信號,則執(zhí)行第一步驟,否則執(zhí)行第二步驟,其中,第一步驟包括:主數(shù)據(jù)服務器向從數(shù)據(jù)服務器下發(fā)分片任務;從數(shù)據(jù)服務器對列式壓縮索引的中間數(shù)據(jù)進行切分以形成索引分片,并將索引分片和行表向量的中間數(shù)據(jù)導入存儲節(jié)點;導入完成后存儲節(jié)點向從數(shù)據(jù)服務器發(fā)送確認消息;第二步驟包括:主數(shù)據(jù)服務器向從數(shù)據(jù)服務器下發(fā)分片任務和上一次分片結果;從數(shù)據(jù)服務器根據(jù)上一次分片結果對列式壓縮索引的中間數(shù)據(jù)進行切分以形成索引分片,并將索引分片和行表向量的中間數(shù)據(jù)導入存儲節(jié)點;存儲節(jié)點將字典向量新增元素個數(shù)、已導入的字典向量的偏移量以及新導入的字典向量的偏移量告知從數(shù)據(jù)服務器;從數(shù)據(jù)服務器根據(jù)字典向量新增元素個數(shù)、已導入的字典向量的偏移量以及新導入的字典向量的偏移量更新全局字典向量的起始下標和行表向量;更新完成后存儲節(jié)點向從數(shù)據(jù)服務器發(fā)送確認消息;從數(shù)據(jù)服務器在接收到所有存儲節(jié)點發(fā)送的確認消息后,向主數(shù)據(jù)服務器匯報當前數(shù)據(jù)分片導入完成;若當前數(shù)據(jù)分片為最后導入的數(shù)據(jù)分片,則列數(shù)據(jù)導入完成,否則重復執(zhí)行第二步驟。7.根據(jù)權利要求6所述的分布式內存列式數(shù)據(jù)庫的索引建立方法,其特征在于,所述存儲節(jié)點包括行表存儲節(jié)點和至少一個索引存儲節(jié)點;索引存儲節(jié)點用于存儲索引分片;行表存儲節(jié)點用于存儲行表向量的中間數(shù)據(jù)。8.根據(jù)權利要求6所述的分布式內存列式數(shù)據(jù)庫的索引建立方法,其特征在于,所述上一次分片結果包括上一個列式壓縮索引的中間數(shù)據(jù)對應的存儲節(jié)點地址、索引分片上界以及索引分片下界。9.根據(jù)權利要求8所述的分布式內存列式數(shù)據(jù)庫的索引建立方法,其特征在于,在第二步驟中,從數(shù)據(jù)服務器將落在同一個區(qū)間內的字典向量中的元素切分在同一個索引分片。10.根據(jù)權利要求6所述的分布式內存列式數(shù)據(jù)庫的索引建立方法,其特征在于,更新全局字典向量的起始下標包括:疊加當前索引分片之前所有索引分片的字典向量新增元素個數(shù)以獲得當前索引分片對應于全局字典向量的起始下標,第一個索引分片對應于全局字典向量的起始下標為O;更新行表向量包括:將每個索引分片已導入的字典向量的偏移量中每個元素加上上一個索引分片字典向量新增元素個數(shù),并拼接所有索引分片已導入的字典向量的偏移量以獲得全局已導入的字典向量的偏移量;將每個索引分片新導入的字典向量的偏移量中每個元素加上上一個索引分片字典向量新增元素個數(shù),并拼接所有索引分片新導入的字典向量的偏移量以獲得全局新導入的字典向量的偏移量;將從數(shù)據(jù)服務器中行表向量的第i位元素與全局新導入的字典向量的偏移量的第rowtable[i]位元素相加以獲得第一更新行表向量,其中,i為自然數(shù),rowtable[i]為從數(shù)據(jù)服務器中行表向量的第i位元素的值;從數(shù)據(jù)服務器將全局已導入的字典向量的偏移量和第一更新行表向量發(fā)送至存儲節(jié)占.V,將存儲節(jié)點中行表向量的第j位元素與全局已導入的字典向量的偏移量的第rowtable[j]位元素相加以獲得第二更新行表向量,其中,j為自然數(shù),rowtable[j]為存儲節(jié)點中行表向量的第j位元素的值;將第一更新行表向量追加到第二更新行表向量之后?!疚臋n編號】G06F17/30GK105843933SQ201610193216【公開日】2016年8月10日【申請日】2016年3月30日【發(fā)明人】段翰聰,閔革勇,鐘紅霞,王瑾,李林,鄭松,張博【申請人】電子科技大學