1. 程式人生 > >Radix Tree在Hyper中的實現:解讀Hyper論文《 The Adaptive Radix Tree: ARTful Indexing for Main-Memory Databases 》

Radix Tree在Hyper中的實現:解讀Hyper論文《 The Adaptive Radix Tree: ARTful Indexing for Main-Memory Databases 》

有問題可以給我發郵件[email protected]

本文討論如何在實際的資料庫系統中應用Radix Tree作為索引,暨解讀HyPer的論文:The Adaptive Radix Tree:ARTful Indexing for Main-Memory Databases。本人和其作者Viktor有過一段時間的共事,希望對大家能有幫助。

Radix Tree實際上就是字首樹,也稱之為Trie。相比B-Tree,其最大的特性是1)數的高度不隨表的大小而增長,而是和key的長度有關;2)更新和刪除不涉及到樹結構的調整。但是因為常用方法往往造成空間上的浪費,所以Radix Tree並沒有廣泛應用在DBMS中。相比之下Linux的檔案系統使用Radix Tree進行檔案路徑的索引,顯而易見是因為字首樹的正好符合檔案路徑的特性。HyPer的這篇文章從實用的角度(發在ICDE也是這個原因)闡述瞭如何在實際的DBMS中實現Radix Tree。

其核心的思想是如何減少空間的浪費。讓我們先舉一個簡單的例子,看看Radix Tree如何浪費空間的。如下圖所示,我們有一顆Radix Tree,每個Node是一個vector<char>,裡面的每個元素存了一個byte(實際系統中,byte是最好的方式)。如果我們要儲存字串,那麼vecotr的大小是26。因此每個Node的大小是26 Bytes。假如我們有100個字串要索引,但每個字串只用到了a, b ,c , d,那麼對於26 Bytes的空間,只用了4個Byte,剩下的全部浪費掉了。

ART設計了4中Node型別:Node4,Node16,Node48和Node256,這裡數字的含義是包含了多少個元素。比如Node4只能存放4個元素,Node16存放16個元素,Node48存放48個元素,Node256存放256個元素。為什麼最大的型別是存放256個元素呢?因為上面我們提到,vector中每個元素是一個Byte,即8 bit。那麼表示的範圍是0~255。也就是說我們不僅僅能儲存字串,也可以儲存integer。比如儲存一個整數5,那麼對於64-bit的機器而言,它的表示方式是0x00 00 00 05。即4個Byte。對於Radix Tree需要四層來存這個整數,每一層存一個Byte字首。


在ART的設計中,Node4是兩個陣列,一個數組是vector<char> key(4),一個是vector<Tree*> pointer(4):key裡是4個元素,每個元素是一個Byte;pointer存了對應的子樹指標(指標是8個位元組)。例如我們要儲存字串art(如上圖所示),樹的第一層的node是Node4型別,第一個陣列key存了字母a,相應地,第二個陣列pointer的第一個元素存了a對應的子樹的指標。同理Node16也是兩個陣列,結構一樣,只不過可以存16個元素。

Node48也是兩個陣列,只不過第一個數是256個元素(這樣就涵蓋了Byte所有表示的全部可能性),第二個陣列是48個元素(每個元素還是指標),這也是為什麼叫Node48的原因。所以可以看到,雖然第一個陣列可以存256個元素,但實際上只存了48個元素,有一定的空間浪費,但為了效率,只能這麼做了。

Node256只包含了一個數組vector<Tree*> pointer(256),因此可以直接通過下標訪問,判斷對應的指標是否存在。

上面四中型別就是ART最重要的資料結構。每次新生成節點的時候,都是Node4型別,也就是最小的。插入資料的時候,如果發現放不下了,就要擴充節點容量變成比當前大一級的節點。

請同時參照ART的論文進行理解。

相關推薦

Radix TreeHyper實現解讀Hyper論文The Adaptive Radix Tree: ARTful Indexing for Main-Memory Databases

有問題可以給我發郵件[email protected] 本文討論如何在實際的資料庫系統中應用Radix Tree作為索引,暨解讀HyPer的論文:The Adaptive Radix Tree:ARTful Indexing for Main-Memory Da

三次貝塞爾曲線關於點與長度在C++實現

三階貝塞爾曲線只能計算近似解,由於使用時對長度的精度要求不高,因此用部落格 【Unity】貝塞爾曲線關於點、長度、切線計算在 Unity中的C#實現 中提供的C#方法改寫為C++的,只是替換了一個結構體,因為並不懂原文中的Vector3類的使用而已。 定義一個POINT結構體,用

在eclipse執行team->pull出現the current branch is not configured for pull

今天在github修改檔案之後想同步到本地工程,在eclipse中點選team–>pull時出現如下提示: 解決方法: 開啟所在倉庫的.git資料夾,修改config檔案,加入如下引數: [branch "master"] remote = master

IDEA錯誤Cannot start compilation: the output path is not specified for module "Test". Specify the out

錯誤是發生在從github上checkout自己的專案時。因為沒有將配置檔案一起上傳,所以在執行java程式時有了這個報錯: Cannot start compilation: the output path is not specified for module “Tes

IDEA錯誤Cannot start compilation: the output path is not specified for module "firstproject”

從coding上checkout自己的專案時,沒有將配置檔案一起上傳,所以在執行java程式時有了這個錯誤 解決辦法: 1、File->Project Setting->Modules->勾選 Inherit project compile path” 2、在Pr

用C語言實現將數組A的內容和數組B的內容進行交換(數組一樣大)。

image pri 之前 es2017 sys 變量 ret 只需要 題目 之前我們已經完成了對兩個變量內容進行交換的程序,這兩道題目大同小異,不過是將兩數變成了兩數組。 可能我們會想:我們是不是需要第三個數組作為中間變量進行交換操作? 答案是no,我們只需要通過一個循環體

到T-SQL DML 三級的階梯在SQL server實現關系模型

有一個 records 建數據庫 外鍵約束 ast base 成功 還需要 lin 作者: Gregory Larsen, 2017/08/02 (第一次出版: 2011/11/09) 翻譯:謝雪妮,許雅莉,賴慧芳,劉瓊濱 譯文: 系列 該文章是階梯系列的一部分:T-

Angular2實現基於TypeScript的對象合並方法extend()

boolean script string ext true false member jquer blog TypeScript裏面沒有現成的合並對象的方法,這裏借鑒jQuery裏的$.extend()方法。寫了一個TypeScript的對象合並方法,使用方法和jQuer

MAC訪問控制機制在Linux系統實現SELinux

SELinuxSELinux全稱:Security-Enhanced Linux,安全加強的Linux;SELinux系統的本來名稱為MAC:強制訪問控制;SELinux就是MAC訪問控制機制在Linux系統中的實現; 操作系統安全等級標準(橙皮書): D級別(最低安全級別) C級別:C1,

Unite 2018 | 《崩壞3》在Unity實現高品質的卡通渲染

width diffuse 動態生成 LG 編輯 www. tgs term 謝謝 本篇文章為Unity官方論壇發布的文章 由於全是幹貨,為了方便自己查找,也為了避免刪除找不到了 於是復制了過來。。。 原文地址: http://forum.china.unity3d.c

SpringAOPProxy動態代理淺解析(被代理對象必須實現接口)

ima throwable light public RR eth 對象 處理 span 小貼士:以下內容純屬個人觀點,如有不當請指出並諒解 import java.lang.reflect.Proxy; Proxy可以動態代理一個對象 寫一個代理工廠類ProxyFac

案例python實現51備忘錄

python1.添加Memo類,至少包含id,name,thing,date四個屬性,date可以暫時使用字符串表示,比如‘1.2’,‘3.8’,暫時不用考慮時間相關模塊 2.id屬性為只讀,其他屬性可讀寫 3.添加MemoAdmin類,作為主體程序,管理Memo類構成的列表,進行Memo的增刪改查(相應方法

呼叫鏈系列二解讀UAVStack的呼叫鏈技術

在上週的推送中,我們介紹了呼叫鏈的模型設計與模型時序圖,本週將為大家繼續介紹呼叫鏈是如何在中介軟體增強技術的賦能之下實現服務端資訊收集以及服務間上下文傳遞的。 服務端資訊收集 服務端資訊收集流程如下圖所示,通過在應用容器(Tomcat等)啟動過程中植入切點,實現在應用邏輯執行之前和之後對請求進行劫持。

javascript實現在N個字串找出最長的公子串

  1 'use strict' 2 3 function 找出最長公子串 (...strings) { 4 let arraiesOfSubStrings = [] 5 arrayOfStrings.reduce((accumulator, currentVal

呼叫鏈系列三解讀UAVStack的呼叫鏈技術

本專題前幾篇文章主要從架構層面介紹瞭如何實現分散式呼叫追蹤系統。這篇文章我們不談架構,就其中的一項關鍵技術實現進行深入探討:如何從超文字傳輸協議(HTTP)中獲取request和response的body和header。 在Java中,HTTP協議的請求/響應模型是由Servlet規範+Servlet容

Faster R-CNN利用區域提案網路實現實時目標檢測 論文翻譯

Faster R-CNN論文地址:Faster R-CNN Faster R-CNN專案地址:https://github.com/ShaoqingRen/faster_rcnn 摘要 目前最先進的目標檢測網路需要先用區域提案演算法推測目標位置,像SPPnet1和Fast R-CNN2

不可錯過的 GAN 資源教程、視訊、程式碼實現、89 篇論文下載

NIP 2016 對抗訓練 Workshop   【網頁】https://sites.google.com/site/nips2016adversarial/   【部落格】http://www.inference.vc/my-summary-of-adversarial-training-

程式設計實現 一組資料只有一個數字出現了一次。其他所有數字都是成對出現的。 請找出這個數字。(使用位運算)

可以在指定陣列中找出只出現一次的元素 #include<stdio.h> int main() { int arr[] = { 1, 3, 4, 3, 1}; int i = 0; int len = sizeof(arr) / sizeof(ar

零成本簡單實現微信直接下載APK

ado log ima 分享 roi 並且 col 安裝apk open 痛點:“點擊右上角打開瀏覽器” 微信是目前用戶活躍量最大的平臺,App推廣始終繞不開微信。但由於微信的機制,常規App無法在微信中點擊下載鏈接直接安裝APK,微信會引導用戶點擊右上角打開瀏覽器再下載。

深度學習布料交換在Keras實現條件類比GAN

  2017年10月26日SHAOANLU 條件類比GAN:交換人物形象的時尚文章(連結) 給定三個輸入影象:人穿著布A,獨立布A和獨立布B,條件類比GAN(CAGAN)生成穿著布B的人類影象。參見下圖。 在我的實驗中,CAGAN能夠交換不同類別的衣服,例如長/短袖T恤(原