国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種高性能的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法

      文檔序號:10612907閱讀:777來源:國知局
      一種高性能的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法
      【專利摘要】本發(fā)明公開了一種高性能的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法,首先整體的索引表結(jié)構(gòu)分級組織;然后在系統(tǒng)的虛擬地址空間中為每級桶鏈表分配一個連續(xù)的虛擬地址空間;將各個桶鏈表映射到對應(yīng)的虛擬地址空間;最后采用鏈表的方式組織各級索引結(jié)構(gòu)中的索引及數(shù)據(jù),鏈表中的每一項為一個桶組織,每個桶組織中存放有該桶組織自身的屬性信息,與指向下一個桶組織的指針以及索引項信息。本發(fā)明提出的數(shù)據(jù)庫索引組織結(jié)構(gòu),插入或刪除數(shù)據(jù)時不需要對數(shù)據(jù)進行排序;VAB桶中的元素是無序存儲,可通過位圖來標識數(shù)據(jù),不需要樹結(jié)構(gòu)那樣為了維持內(nèi)部元素的有序而每次插入或刪除一個數(shù)據(jù)的時候都要進行排序,從而減少大量寫NVM的次數(shù)。
      【專利說明】
      一種高性能的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法
      技術(shù)領(lǐng)域
      [0001] 本發(fā)明涉及數(shù)據(jù)庫領(lǐng)域,特別是一種高性能的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法。
      【背景技術(shù)】
      [0002] 隨著計算機硬件技術(shù)的發(fā)展,內(nèi)存的價格不斷降低,內(nèi)存容量越來越大,將數(shù)據(jù)庫 中全部或者部分數(shù)據(jù)存入內(nèi)存中是完全可行。但是,傳統(tǒng)的DRAM內(nèi)存在掉電后不能保持數(shù) 據(jù),因此不具備數(shù)據(jù)存儲功能。
      [0003] 近年來,出現(xiàn)了一種新型的存儲器,即非易失性存儲器(NVM)。該存儲器的主要特 點有:存儲于NVM的數(shù)據(jù)不會因為掉電或者系統(tǒng)崩潰而丟失,其儲容量可接近磁盤,NVM具有 接近DRAM的讀寫速度。此外,非易失性存儲器還具有高密度、低功耗、抗輻射等諸多優(yōu)點。這 些優(yōu)點使得NVM被公認為有可能在未來數(shù)年內(nèi)替代一部分傳統(tǒng)的DRAM內(nèi)存。NVM將給傳統(tǒng)計 算機內(nèi)存增加數(shù)據(jù)存儲的功能。這種NVM+DRAM的混合型內(nèi)存在未來將成為高速數(shù)據(jù)存儲系 統(tǒng)架構(gòu)的核心。
      [0004] 由于磁盤和內(nèi)存在存儲介質(zhì)、存儲方式和訪問性能上存在巨大的差異,適用于磁 盤的傳統(tǒng)數(shù)據(jù)庫索引并不適用于真正存儲于內(nèi)存的新型內(nèi)存數(shù)據(jù)庫,簡單復(fù)制磁盤數(shù)據(jù)庫 索引的組織和訪問方法將導(dǎo)致巨大的、不必要的系統(tǒng)開銷,阻礙內(nèi)存數(shù)據(jù)庫系統(tǒng)的性能提 升。同時,NVM的每個存儲單元的使用壽命是有限的,當NVM的存儲單元的擦寫次數(shù)超過一個 范圍時,將可能導(dǎo)致其無法正確的存儲數(shù)據(jù)。為了延長NVM內(nèi)存的使用壽命,內(nèi)存數(shù)據(jù)庫的 索引要盡可能地減少對NVM的寫操作次數(shù)。因此,我們在本發(fā)明中提出一套全新的、適用于 非易失性存儲器的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法。
      [0005] 目前,在現(xiàn)有技術(shù)中,常用樹型結(jié)構(gòu)作為數(shù)據(jù)庫的索引結(jié)構(gòu),比如B+Tree、T-tree。 下面以B+Tree為例具體介紹其作為數(shù)據(jù)庫索引的方案。B+Tree的總體結(jié)構(gòu)如圖1,節(jié)點分為 三種:根節(jié)點,非葉子節(jié)點和葉節(jié)點。節(jié)點內(nèi)部可以存放多個元素,并且按照從小到大的順 序有序存儲。除此之外,還包含多個指針,比如指向節(jié)點的父節(jié)點的指針、指向孩子節(jié)點(對 于葉節(jié)點來說,指向的是數(shù)據(jù)存儲的地方)的指針、還有葉子節(jié)點獨有的指向其兄弟節(jié)點的 指針,如表1、表2。葉子節(jié)點存放索引的關(guān)鍵字以及對應(yīng)的指向數(shù)據(jù)的指針,根節(jié)點和葉節(jié) 點只存儲索引關(guān)鍵字。底層葉節(jié)點用指針首尾相連,有利于對葉節(jié)點的遍歷操作。
      [0006] 對于m-n階B+Tree來說,需要滿足的特性有:
      [0007] (1)根節(jié)點是一個葉子結(jié)點或者是一個有2至m個孩子的非葉子結(jié)點;(2)內(nèi)部結(jié)點 有m/2至m個孩子,擁有的關(guān)鍵字數(shù)比擁有的孩子數(shù)少一;(3)葉節(jié)點有n/2至η個孩子,孩子 指向?qū)嶋H的數(shù)據(jù);(4)葉節(jié)點具有相同的尚度;(5)所有結(jié)點存儲的關(guān)鍵字是有序排列的;如 圖 1所不的B+Tree中,m = 3,η = 4,即 3-4 階 B+Tree。
      [0008] 表1是B+Tree內(nèi)部節(jié)點和根節(jié)點內(nèi)部信息示意表,其中kl、k2......kn表示索引的關(guān) 鍵字,chO、chi......chn表示指向孩子的指針,num表示節(jié)點中元素個數(shù):
      [0009] 表lB+Tree內(nèi)部節(jié)點及根節(jié)點
      [0010]
      [0011] 表2是B+Tree葉子節(jié)內(nèi)部信息示意表,h、k2……kn表示關(guān)鍵字,Pl、p 2……pn表示指 向數(shù)據(jù)的指針,num表示節(jié)點中元素個數(shù):
      [0012] 表2B+Tree葉子節(jié)點:
      [0013]
      [0014]~B+Tree作為NVM內(nèi)存數(shù)據(jù)庫索引主要有以下幾個缺點: ' '
      [0015] (1)基于B+Tree的數(shù)據(jù)庫索引在插入、刪除操作中會引起大量針對NVM的寫操作。 因為內(nèi)部索引節(jié)點和葉子節(jié)點中的數(shù)據(jù)都是根據(jù)關(guān)鍵字有序存放。不論是插入還是刪除操 作,只要需要改變節(jié)點中的存儲信息,就需要重新調(diào)整數(shù)據(jù)的存放位置。調(diào)整位置的過程就 會產(chǎn)生大量寫NVM的操作。
      [0016] (2)插入刪除操作不光會導(dǎo)致更新信息的節(jié)點產(chǎn)生寫NVM的操作,還會影響到其他 節(jié)點。因為在插入刪除時會引起節(jié)點的分裂或者合并操作,從而導(dǎo)致為了維護樹的特性要 大范圍進行調(diào)平衡操作,這些操作會對當前節(jié)點的兄弟節(jié)點和父節(jié)點中存儲的信息進行更 改。更改信息的過程會產(chǎn)生大量的寫操作。
      [0017] (3)在范圍查找時,B+Tree要逐個對葉節(jié)點進行訪問查找,會顯著的降低B+Tree的 性能。因為B+Tree將全部的數(shù)據(jù)存放在葉節(jié)點中,并且葉節(jié)點的虛擬地址是離散的,所以在 范圍查找時,要逐個將滿足查找范圍的葉節(jié)點拷貝至內(nèi)存中,不能利用連續(xù)的虛擬地址將 所有符合的葉節(jié)點一次全部拷貝到內(nèi)存。
      [0018] (4)在內(nèi)存中,為了提高緩存命中率,節(jié)點相對較小,因此樹的高度很高,會導(dǎo)致B+ Tree頻繁的調(diào)整樹的結(jié)構(gòu)。調(diào)整結(jié)構(gòu)就會帶來大量的寫NVM的操作。
      [0019] 不論是傳統(tǒng)的B+Tree還是τ-tree等樹結(jié)構(gòu),為了維護其節(jié)點內(nèi)部的有序性和樹的 平衡性,都需要經(jīng)常做出調(diào)整,從而會有大量的NVM寫操作,減少其壽命。
      [0020] 因此,需要一種高性能的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法。

      【發(fā)明內(nèi)容】

      [0021] 本發(fā)明的目的是提出一種高性能的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法。
      [0022] 本發(fā)明的目的是通過以下技術(shù)方案來實現(xiàn)的:
      [0023] 本發(fā)明提供的高性能的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法,包括以下步驟:
      [0024] S1.整體的索引表結(jié)構(gòu)分級組織;
      [0025] S2.在系統(tǒng)的虛擬地址空間中為每級桶鏈表分配一個連續(xù)的虛擬地址空間;
      [0026] S3.將各個桶鏈表映射到對應(yīng)的虛擬地址空間;
      [0027] S4.采用鏈表的方式組織各級索引結(jié)構(gòu)中的索引及數(shù)據(jù),鏈表中的每一項為一個 桶組織,每個桶組織中存放有該桶組織自身的屬性信息,與指向下一個桶組織的指針以及 索引項信息。
      [0028] 進一步,所述步驟S2中的桶鏈表為單級或多級。
      [0029] 進一步,所述步驟S2中所述每級桶鏈表映射到連續(xù)或離散的虛擬地址空間中。
      [0030] 進一步,所述步驟S4中用鏈表、數(shù)組或其他結(jié)構(gòu)組織桶,所述組織桶中存放的屬性 信息包括存放在該桶中的元素的最小值、最大值、個數(shù)和每個元素的標識信息。
      [0031] 進一步,還包括數(shù)據(jù)庫索引離線構(gòu)建,所述數(shù)據(jù)庫索引離線構(gòu)建的具體步驟如下:
      [0032] S11.第一次為數(shù)據(jù)庫構(gòu)建索引表時,數(shù)據(jù)庫中已經(jīng)存有數(shù)據(jù)。首先掃描將要存儲 到數(shù)據(jù)庫中的數(shù)據(jù)。
      [0033] S12.根據(jù)數(shù)據(jù)庫中已有的數(shù)據(jù),選出劃分索引的分界值。
      [0034] S13.計算S12中選出的分界值之間的間距的平均值。選用該平均值作為桶中最大 值與最小值的差值。
      [0035] S14:按照S13得到的差值,建立一級表和二級表,然后將數(shù)據(jù)逐條插入表中。
      [0036] 進一步,所述步驟S12中在選擇劃分索引的分界值時,可以用選取中間值等方法確 定分界值。
      [0037] 進一步,還包括內(nèi)存數(shù)據(jù)庫索引的插入方法,具體步驟如下:
      [0038] S21.接收插入請求,讀入待插入的數(shù)據(jù)。
      [0039] S22.使用連續(xù)的虛擬地址或者使用順序查找確定用于存放待插入數(shù)據(jù)的桶。
      [0040] S23.當S22中找到的桶未滿時,直接把待插入數(shù)據(jù)存放到桶的第一個空位。否則執(zhí) 行S4。
      [0041 ] S24.創(chuàng)建一個新的桶,從原桶內(nèi)的數(shù)據(jù)選出中位數(shù)(記為mid),設(shè)置新桶的最小值 為mid,最大值為原桶的最大值,然后修改原桶的最大值為mid。之后將原桶中大于mid的數(shù) 據(jù)復(fù)制到新桶中,同時修改原桶和新桶的位圖以達到一致的效果。最后將新建的桶插入到 二級表中。
      [0042]進一步,還包括內(nèi)存數(shù)據(jù)庫索引的刪除,所述內(nèi)存數(shù)據(jù)庫索引的刪除具體步驟如 下:
      [0043] S31.接收刪除請求,讀入待刪除的數(shù)據(jù)。
      [0044] S32.使用連續(xù)的虛擬地址空間或者使用順序查找找到存放待刪除數(shù)據(jù)的桶。
      [0045] S33.在S32中所找到的桶中,把存放待刪除數(shù)據(jù)的位置標記為空閑位置。
      [0046] 進一步,還包括內(nèi)存數(shù)據(jù)庫索引的查找,所述內(nèi)存數(shù)據(jù)庫索引的查找具體步驟如 下:
      [0047] S41.接收查找請求,讀入待查找的數(shù)據(jù)。
      [0048] S42.使用連續(xù)的虛擬地址或者使用順序查找獲得待查找的數(shù)據(jù)所在的桶。
      [0049] S43.在S42中所找到的桶中,搜索待查找的數(shù)據(jù),并返回搜索到的數(shù)據(jù)。
      [0050] 進一步,還包括內(nèi)存數(shù)據(jù)庫索引的范圍查找,所述內(nèi)存數(shù)據(jù)庫索引的范圍查找具 體步驟如下:
      [0051] S51.接收范圍查找請求,讀入查找范圍的起始值和終止值。
      [0052] S52.使用連續(xù)的虛擬地址在最高級表中查找該范圍的起始值和終止值所在的桶 的位置。
      [0053] S53.利用虛擬地址空間連續(xù)性的特性,將S52中找到的所有桶一次性拷貝到內(nèi)存 中。
      [0054] S54.在內(nèi)存中查找桶中大于等于范圍查找的起始值并小于等于終止值的數(shù)據(jù)。
      [0055] S55.使用順序查找依次在其他低級表中查找范圍起始值所在的桶的位置。
      [0056] S56.從起始值所對應(yīng)的桶的位置開始,按照順序依次將找到的桶中滿足條件的數(shù) 據(jù)拷貝至內(nèi)存,直到遇到大于終止值的數(shù)據(jù)時結(jié)束查找。
      [0057]由于采用了上述技術(shù)方案,本發(fā)明具有如下的優(yōu)點:
      [0058]本發(fā)明提出的數(shù)據(jù)庫索引組織結(jié)構(gòu),能最大程度的減少NVM擦寫次數(shù),使用VAB管 理數(shù)據(jù)時,插入或刪除數(shù)據(jù)時不需要對數(shù)據(jù)進行排序。VAB桶中的元素是無序存儲的,可以 通過位圖來標識數(shù)據(jù),并不需要像B-Tree等樹結(jié)構(gòu)那樣為了維持內(nèi)部元素的有序而每次插 入或刪除一個數(shù)據(jù)的時候都要進行排序,從而減少大量寫NVM的次數(shù)。
      [0059] VAB的結(jié)構(gòu)穩(wěn)定,不需要經(jīng)常進行調(diào)整;VAB的桶鏈表組織方式使得VAB結(jié)構(gòu)穩(wěn)定, 不需要像樹結(jié)構(gòu)那樣經(jīng)常進行調(diào)平衡的操作,從而大量地減少寫NVM的次數(shù)。
      [0060] 使用連續(xù)的虛擬地址空間和硬件MMU訪問索引;使用連續(xù)的虛擬地址空間組織索 弓丨。在訪問索引的時候,利用CHJ自帶的硬件MMU和索引的虛擬地址定位索引的物理位置,從 而避免了軟件搜索索引的物理位置的開銷,使得訪問索引的速度更快。對于單元素查找,可 以在桶鏈表所形成的連續(xù)的虛擬地址上使用二分法快速查找。范圍查找時只需先在桶鏈表 形成的虛擬地址上進行二分法快速定位到起始地址以及終止地址,然后一次性連續(xù)地讀取 該段虛擬地址。這種方式充分利用了 MMU,并不像傳統(tǒng)的樹結(jié)構(gòu)那樣多次重復(fù)讀取一個指 針,然后找到節(jié)點的位置,拷貝數(shù)據(jù)到內(nèi)存。與樹結(jié)構(gòu)相比,VAB節(jié)省了大量指針訪問和數(shù)據(jù) 拷貝的時間。
      [0061]本發(fā)明的其他優(yōu)點、目標和特征在某種程度上將在隨后的說明書中進行闡述,并 且在某種程度上,基于對下文的考察研究對本領(lǐng)域技術(shù)人員而言將是顯而易見的,或者可 以從本發(fā)明的實踐中得到教導(dǎo)。本發(fā)明的目標和其他優(yōu)點可以通過下面的說明書來實現(xiàn)和 獲得。
      【附圖說明】
      [0062]本發(fā)明的【附圖說明】如下。
      [0063] 圖1為B+Tree不意圖。
      [0064] 圖2為索引存儲于NVM介質(zhì)的體系結(jié)構(gòu)。
      [0065]圖3為數(shù)據(jù)庫應(yīng)用軟件上下文。
      [0066]圖4為本發(fā)明的一級表整體結(jié)構(gòu)。
      [0067]圖5為本發(fā)明的二級表結(jié)構(gòu)圖。
      [0068]圖6為本發(fā)明的VAB查找操作流程。
      [0069]圖7為本發(fā)明的VAB插入操作流程。
      [0070]圖8為本發(fā)明的VAB刪除操作流程。
      [0071]圖9為本發(fā)明的VAB范圍查找流程。
      【具體實施方式】
      [0072]下面結(jié)合附圖和實施例對本發(fā)明作進一步說明。
      [0073] 實施例1
      [0074] 本實施例提供的縮略語和關(guān)鍵術(shù)語定義如下所述:NVM:Non-Volatile Memory,非 易失性存儲器;MMU:Memory Management Unit,存儲管理單元;VAB:Virtual Address Bucket,虛擬地址桶;
      [0075]如圖所示,本實施例提供的高性能的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法,包括以下 步驟:
      [0076] S1.整體的索引表結(jié)構(gòu)分級組織;
      [0077] S2.在系統(tǒng)的虛擬地址空間中為每級桶鏈表分配一個連續(xù)的虛擬地址空間;
      [0078] S3.將各個桶鏈表映射到對應(yīng)的虛擬地址空間;
      [0079] S4.采用鏈表的方式組織各級索引結(jié)構(gòu)中的索引及數(shù)據(jù),鏈表中的每一項為一個 桶組織,每個桶組織中存放有該桶組織自身的屬性信息,與指向下一個桶組織的指針以及 索引項信息。
      [0080] 所述步驟S2中的桶鏈表為單級或多級。
      [0081 ]所述步驟S2中所述每級桶鏈表映射到連續(xù)或離散的虛擬地址空間中。
      [0082]所述步驟S4中用鏈表、數(shù)組或其他結(jié)構(gòu)組織桶,所述組織桶中存放的屬性信息包 括存放在該桶中的元素的最小值、最大值、個數(shù)和每個元素的標識信息。
      [0083] 還包括數(shù)據(jù)庫索引離線構(gòu)建,所述數(shù)據(jù)庫索引離線構(gòu)建的具體步驟如下:
      [0084] S11.第一次為數(shù)據(jù)庫構(gòu)建索引表時,數(shù)據(jù)庫中已經(jīng)存有數(shù)據(jù)。首先掃描將要存儲 到數(shù)據(jù)庫中的數(shù)據(jù)。
      [0085] S12.根據(jù)數(shù)據(jù)庫中已有的數(shù)據(jù),選出劃分索引的分界值。
      [0086] S13.計算S12中選出的分界值之間的間距的平均值。選用該平均值作為桶中最大 值與最小值的差值。
      [0087] S14:按照S13得到的差值,建立一級表和二級表,然后將數(shù)據(jù)逐條插入表中。
      [0088] 所述步驟S12中在選擇劃分索引的分界值時,可以用選取中間值等方法確定分界 值。
      [0089] 還包括內(nèi)存數(shù)據(jù)庫索引的插入方法,具體步驟如下:
      [0090] S21.接收插入請求,讀入待插入的數(shù)據(jù)。
      [0091] S22.使用連續(xù)的虛擬地址或者使用順序查找確定用于存放待插入數(shù)據(jù)的桶。
      [0092] S23.當S22中找到的桶未滿時,直接把待插入數(shù)據(jù)存放到桶的第一個空位。否則執(zhí) 行S4。
      [0093] S24.創(chuàng)建一個新的桶,從原桶內(nèi)的數(shù)據(jù)選出中位數(shù)(記為mid),設(shè)置新桶的最小值 為mid,最大值為原桶的最大值,然后修改原桶的最大值為mid。之后將原桶中大于mid的數(shù) 據(jù)復(fù)制到新桶中,同時修改原桶和新桶的位圖以達到一致的效果。最后將新建的桶插入到 二級表中。
      [0094] 還包括內(nèi)存數(shù)據(jù)庫索引的刪除,所述內(nèi)存數(shù)據(jù)庫索引的刪除具體步驟如下:
      [0095] S31.接收刪除請求,讀入待刪除的數(shù)據(jù)。
      [0096] S32.使用連續(xù)的虛擬地址空間或者使用順序查找找到存放待刪除數(shù)據(jù)的桶。
      [0097] S33.在S32中所找到的桶中,把存放待刪除數(shù)據(jù)的位置標記為空閑位置。
      [0098] 還包括內(nèi)存數(shù)據(jù)庫索引的查找,所述內(nèi)存數(shù)據(jù)庫索引的查找具體步驟如下:
      [0099] S41.接收查找請求,讀入待查找的數(shù)據(jù)。
      [0100] S42.使用連續(xù)的虛擬地址或者使用順序查找獲得待查找的數(shù)據(jù)所在的桶。
      [0101] S43.在S42中所找到的桶中,搜索待查找的數(shù)據(jù),并返回搜索到的數(shù)據(jù)。
      [0102 ]還包括內(nèi)存數(shù)據(jù)庫索引的范圍查找,所述內(nèi)存數(shù)據(jù)庫索引的范圍查找具體步驟如 下:
      [0103] S51.接收范圍查找請求,讀入查找范圍的起始值和終止值。
      [0104] S52.使用連續(xù)的虛擬地址在最高級表中查找該范圍的起始值和終止值所在的桶 的位置。
      [0105] S53.利用虛擬地址空間連續(xù)性的特性,將S52中找到的所有桶一次性拷貝到內(nèi)存 中。
      [0106] S54.在內(nèi)存中查找桶中大于等于范圍查找的起始值并小于等于終止值的數(shù)據(jù)。
      [0107] S55.使用順序查找依次在其他低級表中查找范圍起始值所在的桶的位置。
      [0108] S56.從起始值所對應(yīng)的桶的位置開始,按照順序依次將找到的桶中滿足條件的數(shù) 據(jù)拷貝至內(nèi)存,直到遇到大于終止值的數(shù)據(jù)時結(jié)束查找。
      [0109] 實施例2
      [0110] 本實施例提供的高性能的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法,解決傳統(tǒng)的磁盤數(shù)據(jù) 庫索引無法適用于計算機的內(nèi)存管理環(huán)境,會造成巨大的、不必要的系統(tǒng)開銷。
      [0111] 本實施例提供的內(nèi)存數(shù)據(jù)庫索引組織形式和訪問方法,完全契合于計算機內(nèi)存的 環(huán)境,降低系統(tǒng)訪問數(shù)據(jù)庫索引結(jié)構(gòu)的開銷,極大程度地提高內(nèi)存數(shù)據(jù)庫性能。使得插入、 刪除、查找、范圍查找這些數(shù)據(jù)庫基本操作在NVM內(nèi)存上高效地進行。內(nèi)存數(shù)據(jù)庫索引的組 織和訪問方式充分考慮NVM的存儲特性,并盡可能地減少對NVM的寫操作次數(shù),維護NVM內(nèi)存 的使用壽命。
      [0112]如圖2所示,在使用NVM存儲介質(zhì)作為存儲設(shè)備的體系結(jié)構(gòu)中,NVM與CPU通過內(nèi)存 總線直接連接。系統(tǒng)中,DRAM存儲器與NVM存儲器處于同一個層級。此外,高速緩沖器Cache 位于CPU中。在這種場景中,數(shù)據(jù)庫的索引index與記錄record都存儲在NVM介質(zhì)上。程序代 碼以及系統(tǒng)運行所建立的頁表等結(jié)構(gòu)將存儲于DRAM中。而CPU在執(zhí)行指令時將會首先把數(shù) 據(jù)從DRAM或NVM調(diào)入Cache,然后進行訪問。
      [0113] 圖2為索引存儲于NVM介質(zhì)的體系結(jié)構(gòu),在這種場景中,索引Index的軟件上下文環(huán) 境如圖3所示,圖3為數(shù)據(jù)庫應(yīng)用軟件上下文;通常,數(shù)據(jù)庫應(yīng)用程序主要執(zhí)行插入、刪除、查 找以及范圍查找四種操作。用戶進程發(fā)出某個操作后,數(shù)據(jù)庫進程通過解析器Parser進行 語句解析以及訪問優(yōu)化處理,然后訪問存儲在NVM上的Index。對于插入與刪除操作,將會對 存儲在NVM上的Index進行修改。對于查找與范圍查找操作,將會通過Index定位到存儲在 NVM上所對應(yīng)的記錄Record。
      [0114] 1)VAB索引整體組織方式介紹
      [0115] VAB索引整體結(jié)構(gòu)由一級表、二級表和虛擬地址空間組成。一級表和二級表結(jié)構(gòu)類 似,都是由指針所連接的桶組成,每個桶可以存放多個元素。一級表中的桶將被映射到連續(xù) 虛擬地址空間,目的是提升查找和范圍查找的速度。一級表只有一個,其長度可隨索引長度 增大而增大。二級表可以有一個或多個,其桶結(jié)構(gòu)沒有與虛擬地址進行映射,主要用于緩 沖,從而延遲一級表與虛擬地址重新映射。一級表和二級表之間是相互獨立的。當需要建立 數(shù)據(jù)庫索引的時候,就會對一級表,二級表進行初始化,同時分配出一級表所映射的虛擬地 址空間。當二級表的長度達到閾值,就要與一級表進行合并,此時就需要重新給一級表分配 虛擬地址空間。
      [0116] 圖4為一級表的整體結(jié)構(gòu)不意圖。鏈表中的每一項稱之為桶,每一個桶中存放最小 值,最大值,位圖,數(shù)據(jù)和指向下一個桶的指針。
      [0117] (1)最小值:指的是桶中可以存放的key (鍵值)的最小值。
      [0118] (2)最大值:指的是桶中可以存放的key的最大值。
      [0119] (3)位圖:位圖的每一位用來指示桶中對應(yīng)位置是否存有數(shù)據(jù)。
      [0120] (4)桶中存放的數(shù)據(jù)是以key和record成對存在的,我們將這一對稱為pair。其中 key指的是索引的鍵值,record是一個指向?qū)嶋H數(shù)據(jù)的指針。VAB索引中桶的概念與樹結(jié)構(gòu) 中節(jié)點的概念類似。
      [0121 ] -級表應(yīng)遵循的規(guī)則是:
      [0122] (1)每一個桶中的最大值大于最小值。
      [0123] (2)桶鏈表是有順序的,后一個桶的最小值要大于等于前一個桶的最大值。
      [0124] (3)桶中最多可存放的元素個數(shù)是固定的,并且其中的每一個key的值,都應(yīng)該大 于等于相應(yīng)的桶中指定的最小值并小于最大值。
      [0125] (4)桶中的pair數(shù)據(jù)是無序、隨意存放的,即不需要按照key的大小進行排序,并且 兩個pair之間不一定是緊挨在一起的。
      [0126] 本實施例利用了虛擬地址的特性,將桶鏈表的地址連續(xù)化。具體方式是:申請一段 連續(xù)的虛擬地址空間,將桶鏈表中每一個桶的地址映射到桶映射虛擬地址區(qū)域,下面對這 段虛擬地址區(qū)域的用途加以說明:
      [0127] (1)桶映射虛擬地址區(qū)域用于提升全局查找速度
      [0128] 由于一級表整體是由鏈表的方式將每個桶組織起來的,而且一級表的長度無限。 對于鏈表,其查找方式就只能順序逐一查找,這樣將大大降低查找速度。但以鏈表的方式組 織索引結(jié)構(gòu)的好處是,由于一級表中的桶鏈表是有序的,在添加或刪除一個第一桶的時候 只需要改動相應(yīng)的指針即可,并不需要像數(shù)組一樣為了維護有序性而使得插入或刪除第一 桶的時候,第一桶后面的桶全部要向后移動或向前移動,這樣將產(chǎn)生大量的NVM寫操作。因 此,本發(fā)明通過將桶鏈表映射到虛擬地址空間,使得一級表中所有的桶的地址是連續(xù)的,進 而可以使用二分查找的方法提升桶的查找速度。
      [0129] (2)桶映射虛擬地址區(qū)域用于提升范圍查找速度
      [0130]傳統(tǒng)的樹結(jié)構(gòu)節(jié)點與節(jié)點之間是指針連接,而在范圍查找的過程中會涉及到非常 多的節(jié)點,那么當客戶端向服務(wù)器端數(shù)據(jù)庫請求范圍查找操作的時候,服務(wù)器端數(shù)據(jù)庫將 重復(fù)多次執(zhí)行訪問指針,拷貝整個節(jié)點到客戶端內(nèi)存這樣的操作。而VAB通過將一級表中所 有桶的地址映射到一塊連續(xù)的虛擬地址空間,從而使得在執(zhí)行客戶端向服務(wù)器端數(shù)據(jù)庫請 求范圍查找的時候,可以將虛擬地址空間中的起始地址到終止地址這段范圍內(nèi)的數(shù)據(jù)一次 性拷貝到客戶端的內(nèi)存中,省去了多次的指針訪問和內(nèi)存拷貝的時間,從而提升了范圍查 找的速度。
      [0131]圖4為一級表整體結(jié)構(gòu),除了一級表,VAB索引還有二級表,其結(jié)構(gòu)如圖5所示。二級 表的主要用來作為緩沖,由于一級表的桶鏈表映射到了虛擬地址區(qū)域,一旦一級表中插入 新桶,為了保持一致性,就需要重新給一級表分配虛擬地址空間。所以一級表的結(jié)構(gòu)不易經(jīng) 常變動?;诖?,本發(fā)明設(shè)計了二級表用于緩沖,將新產(chǎn)生的桶插入二級表中,從而保證一 級表的穩(wěn)定性。
      [0132] 二級表的結(jié)構(gòu)與一級表類似,整體結(jié)構(gòu)也是鏈表,鏈表中每一項稱之為桶,桶中存 放最小值,最大值,位圖數(shù)據(jù)和指向下一個槽的指針。這里不再贅述。與一級表不同的是:其 一,一級表的長度是不受限制的,而二級表的長度是有最大限制的,當二級表達到指定的長 度就需要與一級表合并;其二,二級表沒有利用虛擬地址的概念,因為二級表長度比較短, 所以按照順序進行查找即可。注意,二級表的最大長度限制是可以隨著數(shù)據(jù)庫的使用情況 而動態(tài)調(diào)整的。當數(shù)據(jù)庫插入操作過多時,二級表的最大長度限制會增大,這樣可以減少為 一級表重新分配虛擬地址空間的操作;當數(shù)據(jù)庫查詢操作多時,二級表的最大長度限制會 減少,這樣可以提升查詢效率,即多數(shù)查詢在一級表中命中。
      [0133] 圖5為二級表結(jié)構(gòu)圖,2)VAB索引的建立方式,VAB索引的建立分為以下兩種情況:
      [0134] 在線:當用戶進程請求建立數(shù)據(jù)庫索引或插入新元素時,數(shù)據(jù)庫進程逐條讀取索 引及其數(shù)據(jù)然后插入VAB索引表中。這種方法我們稱為在線。
      [0135] 離線:當用戶進程請求建立數(shù)據(jù)庫索引時,數(shù)據(jù)庫進程首先掃描一遍數(shù)據(jù)庫表中 所有要建立索引的鍵值,從而VAB可以根據(jù)這些鍵值的特點有針對性地初始化VAB索引表。 這種方法我們稱為離線。
      [0136] 以下分別為在線和離線建立VAB索引表的方法:
      [0137] 對于離線來說,首先數(shù)據(jù)庫進程掃描所有要建立索引的的鍵值,根據(jù)現(xiàn)有的鍵值, 確定出一個合適的key_padding(鍵值間隔,及每個桶中最大值與最小值之差)大小。從而使 得每個桶內(nèi)的元素能夠比較均勻地分布。在后續(xù)的插入操作中,也能夠盡可能降低桶分裂 的次數(shù),有效的提升性能。具體實現(xiàn)方法如下:首先掃描將要存儲到數(shù)據(jù)庫中的數(shù)據(jù),利用 采樣排序的思想選出分界值,將這些分界值之間的間距的平均值作為key_padding的大小。 按照這個key_padding,建立一級表和二級表,然后將數(shù)據(jù)逐條插入。
      [0138]對于在線來說,根據(jù)系統(tǒng)默認的key_padding大小,建立空的一級表和二級表。然 后將數(shù)據(jù)逐條插入。
      [0139 ] 3) VAB索引的查找操作,圖6為VAB查找操作流程,如圖6所示:
      [0140]①用戶進程調(diào)用數(shù)據(jù)庫進程,請求執(zhí)行查找操作。
      [0141 ]②數(shù)據(jù)庫進程讀取待查找的值,準備執(zhí)行查找操作。
      [0142] ③數(shù)據(jù)庫進程依次查找一級表和二級表,直到找到所請求的索引所在的第一桶。 在查找一級表的過程中,可以在桶鏈表所映射的連續(xù)虛擬地址空間中使用二分法查找,判 斷待查找的數(shù)據(jù)是否大于等于該桶的最小值并小于該桶的最大值,從而快速找到一級表中 對應(yīng)的第一桶。而查找二級表的過程中,則可以順序掃描桶鏈表,進而找到待查找數(shù)據(jù)所對 應(yīng)的第一桶。
      [0143] ④若存在對應(yīng)的第一桶,數(shù)據(jù)庫進程掃描第一桶內(nèi)的數(shù)據(jù),判斷是否存在要查找 的值。若存在,數(shù)據(jù)庫進程會返回該值,表示已經(jīng)查找到;否則,表明沒有查找到,返回用戶 空間。
      [0144] 4) VAB索引的插入操作,圖7為VAB插入操作流程,如圖7所示:
      [0145] ①用戶進程調(diào)用數(shù)據(jù)庫進程,請求執(zhí)行插入操作。
      [0146] ②數(shù)據(jù)庫進程讀取待插入的值,準備執(zhí)行插入操作。
      [0147] ③數(shù)據(jù)庫進程依次查找一級表和二級表,直到確定所請求的索引所在的第一桶。 在查找一級表的過程中,可以在桶鏈表所映射的連續(xù)虛擬地址空間中使用二分法查找,從 而快速找到一級表中對應(yīng)的第一桶。
      [0148] ④若存在對應(yīng)的桶,數(shù)據(jù)庫進程要判斷插入值是否已存在。若存在,表明索引已存 在,返回用戶進程。若不存在則首先判斷第一桶中的數(shù)據(jù)個數(shù)是否已經(jīng)滿了。
      [0149] ⑤若桶中存儲的元素沒有滿,則直接插入key和record,并將位圖中對應(yīng)的位置置 為1。若滿了,則執(zhí)行分裂操作:創(chuàng)建一個新的桶,從原桶內(nèi)的數(shù)據(jù)選出中位數(shù)(記為mid),設(shè) 置新桶的最小值為mid,最大值為原桶的最大值,然后修改原桶的最大值為mid。之后將原桶 中大于mid的數(shù)據(jù)復(fù)制到新桶中,同時修改原桶和新桶的位圖以達到一致的效果。最后將新 建的桶插入到二級表中。
      [0150] ⑥若沒有對應(yīng)的桶,數(shù)據(jù)庫進程會創(chuàng)建一個新桶,設(shè)置桶的最小值和最大值。將待 插入值插入到桶中,修改位圖中對應(yīng)的位。最后將新建的桶插入二級表中。
      [0151] 5)VAB索引的刪除操作,圖8為VAB刪除操作流程,如圖8所示:
      [0152] ①用戶進程調(diào)用數(shù)據(jù)庫進程,請求執(zhí)行刪除操作。
      [0153] ②數(shù)據(jù)庫進程讀取待刪除的值,準備執(zhí)行刪除操作。
      [0154] ③數(shù)據(jù)庫進程依次查找一級表和二級表,直到確定是否存在所請求的索引所在的 第一桶。在查找一級表的過程中,可以在桶鏈表所映射的連續(xù)虛擬地址空間中使用二分法 查找,從而快速找到一級表中對應(yīng)的第一桶。
      [0155] ④若存在對應(yīng)的桶,數(shù)據(jù)庫進程掃描桶內(nèi)的數(shù)據(jù),看是否存在待刪除的值。若存 在,數(shù)據(jù)庫進程會將該值對應(yīng)的位圖位置為〇,表示此數(shù)據(jù)已經(jīng)無效;否則,表明不存在刪除 的值,返回用戶空間。
      [0156] 6) VAB索引的范圍查找操作,圖9為VAB范圍查找流程,如圖9所示:
      [0157] 若范圍查找(key_l,key_r),表示查找key_l至key_r之間的所有索引值,貝lj有:
      [0158] ①用戶進程調(diào)用數(shù)據(jù)庫進程,請求執(zhí)行范圍查找操作。
      [0159] ②數(shù)據(jù)庫進程獲取邊界范圍值key_l和key_r,準備執(zhí)行范圍查找操作。
      [0160] ③數(shù)據(jù)庫進程在一級表中查找,若以及表中沒有桶的范圍在待查找的范圍內(nèi),則 執(zhí)行第④步。否則得到key_l和key_r所對應(yīng)的桶的位置pos_l和pos_r。使用內(nèi)存拷貝函數(shù) memcpy,將pos_l和口〇8_1·之間所有桶對應(yīng)的桶拷貝至內(nèi)存。
      [0161] ④數(shù)據(jù)庫進程在二級表中順序查找,得到key_l所對應(yīng)的桶的位置pos_l。判斷該 桶的最小值是否大于key_r。若最小值小于key_r,則將pos_l對應(yīng)的桶拷貝至內(nèi)存。查找其 中滿足給定范圍的元素。對p〇s_l下一個桶指向的桶進行判斷并查找,依次類推。
      [0162] ⑤最后內(nèi)存對數(shù)據(jù)庫進程拷貝到其中的數(shù)據(jù)進行排序并將最終結(jié)果輸出給用戶。
      [0163] 本實施例對數(shù)據(jù)庫索引結(jié)構(gòu)的組織與訪問方法進行了改進。整體的索引結(jié)構(gòu)改成 桶鏈表式,并結(jié)合虛擬地址空間,充分利用MMU。該索引結(jié)構(gòu)的組織與訪問方法可以大大減 少NVM的擦寫次數(shù)并有較高的操作性能。
      [0164] 本實施例提供的數(shù)據(jù)庫索引組織結(jié)構(gòu),最大程度的減少NVM擦寫次數(shù);
      [0165] (1)使用VAB管理數(shù)據(jù)時,插入或刪除數(shù)據(jù)時不需要對數(shù)據(jù)進行排序。
      [0166] VAB桶中的元素是無序存儲的,可以通過位圖來標識數(shù)據(jù),并不需要像B-Tree等樹 結(jié)構(gòu)那樣為了維持內(nèi)部元素的有序而每次插入或刪除一個數(shù)據(jù)的時候都要進行排序,從而 減少大量寫NVM的次數(shù)。
      [0167] (2)VAB的結(jié)構(gòu)穩(wěn)定,不需要經(jīng)常進行調(diào)整。
      [0168] VAB的桶鏈表組織方式使得VAB結(jié)構(gòu)穩(wěn)定,不需要像樹結(jié)構(gòu)那樣經(jīng)常進行調(diào)平衡的 操作,從而大量地減少寫NVM的次數(shù)。
      [0169] 2.使用連續(xù)的虛擬地址空間和硬件MMU訪問索引
      [0170] 使用連續(xù)的虛擬地址空間組織索引。在訪問索引的時候,利用CPU自帶的硬件MMU 和索引的虛擬地址定位索引的物理位置,從而避免了軟件搜索索引的物理位置的開銷,使 得訪問索引的速度更快。
      [0171] 對于單元素查找,可以在桶鏈表所形成的連續(xù)的虛擬地址上使用二分法快速查 找。范圍查找時只需先在桶鏈表形成的虛擬地址上進行二分法快速定位到起始地址以及終 止地址,然后一次性連續(xù)地讀取該段虛擬地址。這種方式充分利用了 MMU,并不像傳統(tǒng)的樹 結(jié)構(gòu)那樣多次重復(fù)讀取一個指針,然后找到節(jié)點的位置,拷貝數(shù)據(jù)到內(nèi)存。與樹結(jié)構(gòu)相比, VAB節(jié)省了大量指針訪問和數(shù)據(jù)拷貝的時間。
      [0172] 本實施例的高性能的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法中的NVM擦寫次數(shù)少:
      [0173] 因為VAB桶內(nèi)部的元素是無序的,插入刪除操作都不需要對桶內(nèi)部的元素排序。索 引中所有的桶以鏈表的形式連接,在合并、分裂等操作的過程中只需要修改幾個指針,從而 大量減少了對NVM的擦寫次數(shù)。
      [0174] 本實施例的高性能的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法中的數(shù)據(jù)庫操作時間短:
      [0175] 因為桶內(nèi)部元素無序,插入和刪除操作時省去了排序的過程,查找和范圍查找兩 個操作既可以直接在鏈表上進行查找又可以采用映射到虛擬地址空間的方式進行查找。而 本發(fā)明采用后者,充分利用了 MMU的特性,從而縮短了時間。
      [0176] 最后說明的是,以上實施例僅用以說明本發(fā)明的技術(shù)方案而非限制,盡管參照較 佳實施例對本發(fā)明進行了詳細說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當理解,可以對本發(fā)明的技 術(shù)方案進行修改或者等同替換,而不脫離本技術(shù)方案的宗旨和范圍,其均應(yīng)涵蓋在本發(fā)明 的權(quán)利要求范圍當中。
      【主權(quán)項】
      1. 一種高性能的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法,其特征在于:包括以下步驟:51. 整體的索引表結(jié)構(gòu)分級組織;52. 在系統(tǒng)的虛擬地址空間中為每級桶鏈表分配一個連續(xù)的虛擬地址空間;53. 將各個桶鏈表映射到對應(yīng)的虛擬地址空間;54. 采用鏈表的方式組織各級索引結(jié)構(gòu)中的索引及數(shù)據(jù),鏈表中的每一項為一個桶組 織,每個桶組織中存放有該桶組織自身的屬性信息,與指向下一個桶組織的指針以及索引 項信息。2. 如權(quán)利要求1所述的高性能的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法,其特征在于:所述步 驟S2中的桶鏈表為單級或多級。3. 如權(quán)利要求1所述的高性能的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法,其特征在于:所述步 驟S2中所述每級桶鏈表映射到連續(xù)或離散的虛擬地址空間中。4. 如權(quán)利要求1所述的高性能的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法,其特征在于:所述步 驟S4中用鏈表、數(shù)組或其他結(jié)構(gòu)組織桶,所述組織桶中存放的屬性信息包括存放在該桶中 的元素的最小值、最大值、個數(shù)和每個元素的標識信息。5. 如權(quán)利要求1所述的高性能的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法,其特征在于:還包括 數(shù)據(jù)庫索引離線構(gòu)建,所述數(shù)據(jù)庫索引離線構(gòu)建的具體步驟如下:511. 第一次為數(shù)據(jù)庫構(gòu)建索引表時,數(shù)據(jù)庫中已經(jīng)存有數(shù)據(jù)。首先掃描將要存儲到數(shù) 據(jù)庫中的數(shù)據(jù)。512. 根據(jù)數(shù)據(jù)庫中已有的數(shù)據(jù),選出劃分索引的分界值。513. 計算S12中選出的分界值之間的間距的平均值。選用該平均值作為桶中最大值與 最小值的差值。 S14:按照S13得到的差值,建立一級表和二級表,然后將數(shù)據(jù)逐條插入表中。6. 如權(quán)利要求1所述的高性能的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法,其特征在于:所述步 驟S12中在選擇劃分索引的分界值時,可以用選取中間值等方法確定分界值。7. 如權(quán)利要求1所述的高性能的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法,其特征在于:還包括 內(nèi)存數(shù)據(jù)庫索引的插入方法,具體步驟如下:521. 接收插入請求,讀入待插入的數(shù)據(jù)。522. 使用連續(xù)的虛擬地址或者使用順序查找確定用于存放待插入數(shù)據(jù)的桶。 S23 .當S22中找到的桶未滿時,直接把待插入數(shù)據(jù)存放到桶的第一個空位。否則執(zhí)行 S4〇 S24.創(chuàng)建一個新的桶,從原桶內(nèi)的數(shù)據(jù)選出中位數(shù)(記為mid),設(shè)置新桶的最小值為 mid,最大值為原桶的最大值,然后修改原桶的最大值為mid。之后將原桶中大于mid的數(shù)據(jù) 復(fù)制到新桶中,同時修改原桶和新桶的位圖以達到一致的效果。最后將新建的桶插入到二 級表中。8. 如權(quán)利要求1所述的高性能的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法,其特征在于:還包括 內(nèi)存數(shù)據(jù)庫索引的刪除,所述內(nèi)存數(shù)據(jù)庫索引的刪除具體步驟如下:531. 接收刪除請求,讀入待刪除的數(shù)據(jù)。532. 使用連續(xù)的虛擬地址空間或者使用順序查找找到存放待刪除數(shù)據(jù)的桶。533. 在S32中所找到的桶中,把存放待刪除數(shù)據(jù)的位置標記為空閑位置。9. 如權(quán)利要求1所述的高性能的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法,其特征在于:還包括 內(nèi)存數(shù)據(jù)庫索引的查找,所述內(nèi)存數(shù)據(jù)庫索引的查找具體步驟如下:541. 接收查找請求,讀入待查找的數(shù)據(jù)。542. 使用連續(xù)的虛擬地址或者使用順序查找獲得待查找的數(shù)據(jù)所在的桶。543. 在S42中所找到的桶中,搜索待查找的數(shù)據(jù),并返回搜索到的數(shù)據(jù)。10. 如權(quán)利要求1所述的高性能的內(nèi)存數(shù)據(jù)庫索引組織與訪問方法,其特征在于:還包 括內(nèi)存數(shù)據(jù)庫索引的范圍查找,所述內(nèi)存數(shù)據(jù)庫索引的范圍查找具體步驟如下: S51.接收范圍查找請求,讀入查找范圍的起始值和終止值。 S52 .使用連續(xù)的虛擬地址在最高級表中查找該范圍的起始值和終止值所在的桶的位 置。553. 利用虛擬地址空間連續(xù)性的特性,將S52中找到的所有桶一次性拷貝到內(nèi)存中。554. 在內(nèi)存中查找桶中大于等于范圍查找的起始值并小于等于終止值的數(shù)據(jù)。555. 使用順序查找依次在其他低級表中查找范圍起始值所在的桶的位置。556. 從起始值所對應(yīng)的桶的位置開始,按照順序依次將找到的桶中滿足條件的數(shù)據(jù)拷 貝至內(nèi)存,直到遇到大于終止值的數(shù)據(jù)時結(jié)束查找。
      【文檔編號】G06F17/30GK105975587SQ201610293706
      【公開日】2016年9月28日
      【申請日】2016年5月5日
      【發(fā)明人】諸葛晴鳳, 沙行勉, 姜煒文
      【申請人】諸葛晴鳳
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1