意性表示300。一個(gè)或多個(gè)主片段或片段330可用于數(shù)據(jù)庫(kù)的每個(gè)表格或列。小的、易管理的表格可利用單個(gè)片段來表不。非常大的表格可被分割成兩個(gè)或更多個(gè)表格分區(qū)335。每個(gè)表格分區(qū)進(jìn)而可包括兩個(gè)或更多個(gè)片段330。片段330可以是其所屬的表格的水平切片。每個(gè)片段330可包括一個(gè)或多個(gè)列片段340。每個(gè)列片段340可具有符合本文描述的特征的其自己的字典和值ID陣列。
[0034]片段330可有利地充分大以獲得由于片段的最優(yōu)化壓縮以及聚合和掃描的高內(nèi)存性能而產(chǎn)生的最大性能。相反,這種片段可充分地小以將任何給定片段的最大列加載到存儲(chǔ)器中并且在內(nèi)存對(duì)該片段排序。片段也可充分地小以能夠?qū)蓚€(gè)或更多個(gè)部分為空的片段合并成更小數(shù)目的片段。作為這個(gè)方面的說明性而非限制性的示例,一片段可包含十億行,其中每列最多有10GB的數(shù)據(jù)。其它片段大小也在當(dāng)前主題的范圍內(nèi)。片段可以可選地包括頁(yè)的鏈。在一些實(shí)現(xiàn)方式中,列也可包括頁(yè)的鏈。列數(shù)據(jù)可例如利用字典和/或任何其它壓縮方法來加以壓縮。表格片段可被實(shí)體化在內(nèi)存的連續(xù)地址空間中以獲得最大性能。數(shù)據(jù)庫(kù)的所有片段可被存儲(chǔ)在盤上,并且對(duì)這些片段的訪問可基于對(duì)查詢的數(shù)據(jù)訪問要求的分析來作出。
[0035]再次參考圖2,體系結(jié)構(gòu)200的其它部分可包括數(shù)據(jù)操縱語言(data manipulat1nlanguage,DML)處理模塊或類似功能214、一個(gè)或多個(gè)查詢處理模塊或類似功能216(例如包括多版本并發(fā)控制)、支持索引存儲(chǔ)212的索引構(gòu)建器220、查詢語言引擎222(其可以例如是SQL引擎)、用于接收來自用戶226的輸入的復(fù)雜事件處理模塊(例如,事件處理器、流處理模塊,等等)224,等等。
[0036]圖4示出了圖示統(tǒng)一表格容器頁(yè)鏈400的示例的框圖。如上所述,每個(gè)片段可以可選地包括頁(yè)的鏈。一般地,容器可被表示為頁(yè)鏈。頁(yè)鏈一般可被表征為以給定順序鏈接的頁(yè)的集合。本文使用的術(shù)語“頁(yè)”指的是數(shù)據(jù)庫(kù)中的存儲(chǔ)的基本單位。頁(yè)大小一般是在構(gòu)建數(shù)據(jù)庫(kù)時(shí)確立的并且通常不能被改變。代表性的頁(yè)大小可以是21^、41^、81^、161^等等級(jí)別的。一旦構(gòu)建了服務(wù)器,該值通常就不能被改變。不同類型的頁(yè)可存儲(chǔ)不同類型的數(shù)據(jù)庫(kù)對(duì)象。例如,數(shù)據(jù)頁(yè)可以為表格存儲(chǔ)數(shù)據(jù)行或列。索引頁(yè)可以為索引的一個(gè)或多個(gè)級(jí)別存儲(chǔ)索引行。大對(duì)象(large object,LOB)頁(yè)可以為文本和圖像列、為Java行外列等等存儲(chǔ)數(shù)據(jù)。
[0037]也如圖4中所示,可對(duì)增量部分、主部分、字典、索引段(可選,在圖2中沒有示出)等等定義頁(yè)鏈的子鏈,使得這些實(shí)體中的每一者的“整體”包含一個(gè)或多個(gè)頁(yè)。在當(dāng)前主題的一些實(shí)現(xiàn)方式中,增量部分可包括“熱”增量片段402和“冷”增量片段404兩者,這兩者可分開存儲(chǔ)。主部分也可被再分成主片段330。包含字典壓縮列式數(shù)據(jù)410的頁(yè)可以指為它們包含字典的頁(yè)。個(gè)體表格部分可根據(jù)需要被加載到主存儲(chǔ)器中。合并過程可與事務(wù)處理解除耦合,使得合并過程可在恢復(fù)時(shí)(例如在日志重放期間)執(zhí)行。頁(yè)鏈,例如圖4中所示的示例,可由容器目錄條目(container directory entry,CDE)412發(fā)起。
[0038]單個(gè)RowID空間可在頁(yè)鏈中跨頁(yè)使用。一般指代數(shù)據(jù)庫(kù)中的邏輯行的RowID可用于指代數(shù)據(jù)庫(kù)的內(nèi)存部分中的邏輯行并且也指代數(shù)據(jù)庫(kù)的盤上部分中的物理行。行索引通常指的是表格中的行的物理的基于O的索引?;贠的索引可用于對(duì)連續(xù)陣列中的行物理尋址,其中邏輯RowID表示行的邏輯順序,而不是物理位置。在一些內(nèi)存數(shù)據(jù)庫(kù)系統(tǒng)中,用于數(shù)據(jù)記錄位置的物理標(biāo)識(shí)符可被稱為UDIV或DocID。與邏輯RowID不同,UDIV或DocID(或者相當(dāng)?shù)膮?shù))可指示行(例如數(shù)據(jù)記錄)的物理位置,而RowID指示邏輯位置。為了允許表格的分區(qū)具有符合當(dāng)前主題的實(shí)現(xiàn)方式的單個(gè)RowID和行索引空間,對(duì)于新插入的記錄以及對(duì)于跨片段的更新記錄的新版本,RowID可被指派單調(diào)遞增的ID。換言之,例如,更新記錄將改變其RowID,因?yàn)楦聦?shí)際上是(具有RowID的)舊記錄的刪除和(具有新RowID的)新記錄的插入。利用此方案,表格的增量存儲(chǔ)可按RowID來排序,這可用于訪問路徑的最優(yōu)化。分開的物理表格實(shí)體可按分區(qū)來存儲(chǔ),并且這些分開的物理表格實(shí)體可在查詢級(jí)別被連接成邏輯表格。
[0039]當(dāng)在列式合并操作期間執(zhí)行最優(yōu)化壓縮以將增量存儲(chǔ)中記錄的改變添加到主存儲(chǔ)時(shí),表格中的行一般被重排序。換言之,合并操作之后的行通常不再是按其物理行ID排序的。因此,根據(jù)當(dāng)前主題的一個(gè)或多個(gè)實(shí)現(xiàn)方式可使用穩(wěn)定的行標(biāo)識(shí)符。穩(wěn)定行標(biāo)識(shí)符可以可選地是邏輯RowID。對(duì)穩(wěn)定的邏輯(而不是物理)RowID的使用可允許在預(yù)寫式日志和事務(wù)撤銷日志中的RED0/UND0條目中尋址行。此外,以這種方式可促進(jìn)跨合并穩(wěn)定、而不會(huì)保持對(duì)數(shù)據(jù)庫(kù)的舊主版本的引用的光標(biāo)。為了使能這些特征,可存儲(chǔ)內(nèi)存邏輯RowID到物理行索引的映射和相反方向的映射。在當(dāng)前主題的一些實(shí)現(xiàn)方式中,RowID列可被添加到每個(gè)表格。RowID列在當(dāng)前主題的一些實(shí)現(xiàn)方式中也可服從壓縮。
[0040]圖5示出了符合當(dāng)前主題的一個(gè)或多個(gè)實(shí)現(xiàn)方式的統(tǒng)一表格增量500的框圖。在一些示例中,可使用“熱”和“冷”增量方案,其中未壓縮的數(shù)據(jù)被保存在“熱”增量部分中,而字典壓縮的數(shù)據(jù)被保存在“7令”增量部分中,其中在熱部分和冷部分之間執(zhí)行微型合并。這種增量部分可被認(rèn)為是單個(gè)容器。如圖5中所示,每個(gè)增量子鏈可具有其自己的暫態(tài)結(jié)構(gòu)。換言之,對(duì)于每個(gè)增量可使用單獨(dú)的結(jié)構(gòu)。頁(yè)向量502可保持到個(gè)體頁(yè)504的頁(yè)句柄并且可允許頁(yè)504上的快速迭代(例如作為列或表格掃描的一部分)。到個(gè)體頁(yè)504的頁(yè)句柄可包括被保持在存儲(chǔ)器中的釘?shù)鹊取.?dāng)在本文中使用時(shí),術(shù)語“釘(Pin)”指的是將特定數(shù)據(jù)頁(yè)(其也可能已被存儲(chǔ)在盤上)保持在存儲(chǔ)器中。作為示例,如果頁(yè)未被釘住,則其可被從存儲(chǔ)器清除。釘住通常在被活躍訪問的數(shù)據(jù)頁(yè)上進(jìn)行以避免與將頁(yè)從盤讀取到存儲(chǔ)器中相關(guān)聯(lián)的潛在性能劣化。
[0041 ] RowID索引506可充當(dāng)搜索結(jié)構(gòu)以允許基于RowID值的給定間隔來找到頁(yè)504。搜索時(shí)間可以是log η級(jí)別的,其中η非常小。RowID索引可經(jīng)由RowID值提供對(duì)數(shù)據(jù)的快速訪問。為了優(yōu)化,“新”頁(yè)在RowID和行索引之間可具有1:1關(guān)聯(lián),使得簡(jiǎn)單數(shù)學(xué)(沒有查找)操作成為可能。在當(dāng)前主題的至少一些實(shí)現(xiàn)方式中,只有被合并過程重組織的頁(yè)需要RowID索引。
[0042]圖6示出了統(tǒng)一表格未排序字典600的框圖。根據(jù)當(dāng)前主題的一個(gè)或多個(gè)實(shí)現(xiàn)方式,增量部分中的列數(shù)據(jù)可使用未排序字典。對(duì)每個(gè)增量列字典可提供暫態(tài)結(jié)構(gòu)。頁(yè)向量502可處理頁(yè)在存儲(chǔ)器中的釘住。從其它結(jié)構(gòu)經(jīng)由指針可提供直接訪問。值向量間接602可允許每個(gè)字典塊604相同數(shù)目的值。此能力對(duì)于按ValueID查找值可支持I級(jí)別的性能成本。字典可向每個(gè)唯一值指派唯一的ValueID(通常是數(shù)值),使得唯一值(其通常在存儲(chǔ)器大小上大于ValueID)可被存儲(chǔ)一次而不是多次。值陣列是被字典用來在給定ValueID的情況下檢索值或者在給定值的情況下檢索ValueID的結(jié)構(gòu)。此技術(shù)可減小在值不唯一的情況下存儲(chǔ)一組值所需要的存儲(chǔ)器量,其通常被稱為字典壓縮。值到ValueID映射606對(duì)于按值查找ValueID可支持I級(jí)別的或者log η級(jí)別的散列或B樹大小。B樹是一種使數(shù)據(jù)保持被排序并允許對(duì)數(shù)時(shí)間的搜索、順序訪問、插入和刪除的樹數(shù)據(jù)結(jié)構(gòu)。此能力對(duì)于字典壓縮可能是必要的。B樹對(duì)于范圍掃描可能更好,但維護(hù)起來可能更昂貴。
[0043]圖7示出了用于在統(tǒng)一表格上執(zhí)行增量合并操作710的功能框圖700。新的事務(wù)或改變可最初被寫入到增量存儲(chǔ)206中。主存儲(chǔ)210可包括一個(gè)活躍片段712和一個(gè)或多個(gè)關(guān)閉片段716。當(dāng)更新被從增量存儲(chǔ)206合并到主存儲(chǔ)210中時(shí),關(guān)閉片段716中的現(xiàn)有記錄不能被改變。反而,記錄的新版本可被添加到活躍片段712,并且舊版本可被標(biāo)記為無效。
[0044]功能框圖700也圖示了讀取操作720。一般地,讀取操作可具有對(duì)所有片段(S卩,活躍片段712和關(guān)閉片段716)的訪問??赏ㄟ^僅加載包含來自特定查詢的數(shù)據(jù)的片段來優(yōu)化讀取操作。不包含這種數(shù)據(jù)的片段可被排除。為了做出此決定,可對(duì)每個(gè)片段存儲(chǔ)容器級(jí)元數(shù)據(jù)(例如,最小值和/或最大值)??蓪⒋嗽獢?shù)據(jù)與查詢相比較來判定片段是否包含請(qǐng)求的數(shù)據(jù)。
[0045]參考圖8的圖800,索引向量810可包括后備陣列(backing array)820。后備陣列820是存儲(chǔ)器的其中維護(hù)著vid的區(qū)塊。后備陣列820在一些情況下可以是固定存儲(chǔ)器的。當(dāng)后備陣列820(有時(shí)被稱為第一后備陣列)變滿時(shí),分配更大大小的新的后備陣列830(有時(shí)被稱為第二后備陣列)并且舊的后備陣列820被新的所替換。例如,可在以下情況發(fā)生時(shí)分配新的后備陣列830: (i)要為超出當(dāng)前后備陣列820的容量的行位置插入vid,或者(ii)要插入超出當(dāng)前用于將vid編碼到后備陣列820中的η比特編碼的vid。
[0046]可對(duì)每個(gè)索引向量實(shí)例改變決定新后備陣列830的大小的試探。當(dāng)前,新后備陣列830可被配置為始終具有比其所替換的那個(gè)更大的容量(因?yàn)樵隽看鎯?chǔ)是僅限插入的并且其只是被附加到),并且關(guān)于新