用于主存储器列存储装置的基于字典的保持顺序的串压缩的制作方法

文档序号:6604769阅读:147来源:国知局

专利名称::用于主存储器列存储装置的基于字典的保持顺序的串压缩的制作方法
技术领域
:本发明的实施例一般地涉及软件领域,并且更具体地涉及数据结构,该数据结构支持具有可随时间改变的大的域的大小(domainsize)的串属性的保持顺序的字典压缩。
背景技术
:在计算领域中,数据库管理系统(DBMS)是控制数据库存储单元中的数据的组织、存储、管理和检索的一组软件程序。传统上,DBMS是面向行的数据库系统;然而,存在面向列的数据库系统。面向列的数据库系统按照列而不是按照行来存储其内容。对于数据库来说,这可以具有优势,其中,在大量类似的数据项上计算总和(aggregate)。DBMS的面向列的实现将依次存储给定列的属性,并且依次存储同一列的列值,一列的末尾之后跟着在下一列的开头。当必须在很多行上、但是仅对所有数据列的较小的子集计算总和时,面向列的数据库系统可以更高效。之所以能够这样,至少是因为读取数据的较小子集可以比读取所有数据更快。当一次对所有行提供一列的新值时,面向列的数据库系统也可以更高效,因为该列数据可以被高效地写入,并且可以替换旧的列数据,而不干扰所述行的任何其它列。
发明内容描述了这样的方法和系统,该方法和系统涉及支持可变长度的串属性的保持顺序的字典压缩的数据结构,其中,域的大小较大或者预先未知。在一个实施例中,所述方法包括将多个串值经由编码索引传播到字典的共享树叶结构的压缩数据。对于所述多个串值,通过查找操作来获取多个保持顺序的整数代码。如果在所述获取期间没有找到所述多个整数代码的子集,则将没有找到的所述多个整数代码的子集所针对的所述多个串值的子集插入共享树叶结构中。该方法还包括产生所述多个串值的对应子集的所述多个整数代码的子集。最后,提供保持顺序的所述多个整数代码的列表,其中,该列表也包括所产生的所述多个整数代码的子集。在一个实施例中,所述系统包括面向列的数据库系统和基于字典的存储单元,该存储单元指定在该面向列的数据库系统中,在多个可变长度的串值和多个整数代码之间的映射。此外,所述系统包括共享树叶数据结构,该数据结构在其树叶中按照排序(sort)顺序来保存基于字典的存储单元的数据。此外,包括与基于字典的存储单元通信的处理器,其中,该处理器可操作以使用共享树叶数据结构将所述多个可变长度的串值编码为所述多个整数代码以及将所述多个整数代码解码为所述多个可变长度的串值。当考虑结合附图提供的对本发明的优选实施例的以下详细描述时,本发明的实施例的这些和其它益处和特征将显而易见,在附图中,自始至终使用相同的参考标号来标识相同的元件。在附图的各个图中,作为示例而不是作为限制图示了本发明,在附图中,相同的参考标号指示相似的元件。应当注意,在本公开中,对于“一”或“一个”实施例的提及不一定针对同一个实施例,这样的提及是指至少一个。图1是可变长度的串属性的保持顺序的字典压缩的实施例的图。图2是示出用于对表T的属性编制索引的直接、间接和共享树叶方法的图。图3是示出共享树叶方法如何支持字典内的数据加载和查询处理的实施例的流程图。图4是示出全部成批(all-bulked)策略和混合策略的实施例的图。图5是根据本发明实施例的用于可变长度的串值的树叶结构的存储器布局的示例。图6是用于使用CS数组trie来将数据编码的实施例的图。图7是根据实施例的CS前缀树的示例的图。图8是从给定的树叶层级开始的CS前缀树的批量(bulk)加载过程的实施例的流程图。图9是根据实施例的来自示出树叶结构的性能和存储器开销的实验的结果的图。图10是根据实施例的来自示出编码索引的查找和更新成本的实验的结果的图。图11是根据实施例的来自示出字典的可扩展性的实验的结果的图。图12是根据本发明实施例的计算系统的示例的示意图。具体实施例方式本发明的实施例涉及支持具有可能随时间改变的大的域的大小的串属性的保持顺序的字典压缩的数据结构。所认为的是,面向列的数据库系统在分析工作负荷(workload)上比传统的面向行的数据库系统表现更好。用于面向列的数据库系统的轻量级压缩方案可以使能对压缩数据进行查询处理,从而提高查询处理性能。字典编码利用较短的固定长度的整数代码来代替可变长度的属性值。为了以这种方式压缩列数据,现有的列存储器通常创建不同值的字典数组(dictionaryarray),然后将每个属性值作为索引存储到该数组中。如果域的大小小,则可以在列存储器中使用字典。可以在字典顶部使用比特组装(bitpacking),以便通过计算将最大索引编码到字典中所需的最小比特数目来进一步压缩数据。如果域的大小稳定或者事先已知,则比特组装是有用的,但是,在应用场景中,域的大小可能随着时间增大。如果域的大小事先未知,则列存储器可以分析数据的第一次批量加载(bulkload)以便找出给定属性的当前域的大小,然后导出最小比特数目(用于比特组装)。如果后续的批量加载包含新值,则所有先前加载的数据可以被解码,然后以使用更多比特的新加载而再次被编码。列存储器常常使用保持顺序的压缩方案来加快昂贵的查询操作,因为所述操作随后可以直接对编码数据执行。然而,这样的压缩方案要么产生昂贵的可变长度代码,要么产生难以扩展的固定长度代码。对于域的大小事先不知道的大字典,排序后的数组和用于索弓I的固定长度整数代码过于昂贵。图1是可变长度的串属性的保持顺序的字典压缩的实施例的图。在实施例中,定义支持域的大小大或事先不知道的可变长度的串属性的保持顺序的字典压缩的数据结构。所产生的整数代码具有固定长度,并且不使用比特组装。可以将字典定义为表,该表指定串值和整数代码之间的映射。可以定义用于访问字典的索引结构,其支持数据加载110、查询编译120和查询执行130。过程100以数据加载110开始。通常,将数据成批地加载到数据仓库中。在实施例中,字典支持使用整数代码编码多批串值。该编码可以由以下操作组成1)在字典中批量查找(bulklookup)用于串值的整数代码;以及2)批量插入(bulkinsertion)新串值以及生成用于该新值的保持顺序的整数代码。图1示出了如何将两批产品数据(批次105和批次115)加载到串字典(例如125)并且使用整数代码135编码。此外,过程100包括查询编译120。为了对编码数据执行分析查询,需要重写查询谓词(predicate)。谓词是描述对象的性质或由变量表示的对象之间的关系的短语模板(phrasetemplate)。例如,串字典125包括串值的列表全脂奶一加仑,全脂奶一夸脱等,其中,“全脂奶”是这些串的谓词。查询编译120涉及利用对应的整数代码重写相等谓词(equalitypredicate)(例如,p_name=“全脂奶-加仑”)中或者范围谓词(例如,p_name>“全脂奶-加仑”)中的串常量。保持顺序的编码方案允许用整数代码替换相等谓词和范围谓词的串常量,并且允许前缀谓词(例如,P_name=“全脂奶*”)被映射到范围谓词。例如,通过将具有前缀谓词“全脂奶*”的串常量“pjame”重写为范围谓词32100^p_name彡32000,在查询145(QUERY:SLELECTSUM(0_T0TAL),P_NAMEFROMSALES,PRODUCTSWHEREP_NAME^32000ANDP_NAME彡32100GROUPBYP_NAME,查询从销售额、产品中选择按照P_NAME分组的P_NAME彡32000并且P_NAME^32100的总销售额,P_NAME)中重写原始查询140(QUERY:SLELECTSUM(0_T0TAL),P_NAMEFROMSALES,PRODUCTSWHEREP_NAME='WHOLEMILK*’GROUPBYP_NAME,查询从销售额、产品中选择按照P_NAME分组的P_NAME=‘全脂奶*’的总销售额,P.NAME)。在实施例中,串字典125支持查找操作以重写串常量以及串前缀。过程100还包括查询执行130。在查询执行130期间,使用字典125将编码的查询结果150解码。在实施例中,串字典155支持作为整数代码的列表给出的编码的查询结果150的解码,以产生作为串值160的查询结果。编码的查询结果150被解码为代表串值105的未编码的查询结果160的列表。在实施例中,串字典是具有两个属性的表T:T=(值,代码)。表T定义可变长度的串值(由属性值定义)到固定长度的整数代码(由属性代码定义)的映射以及固定长度的整数代码到可变长度的串值的映射。字典支持以下用于将串值编码和解码并且使得能够重写查询谓词的操作1)编码值一代码;2)解码代码一值;3)查找(值,类型)一代码;以及4)查找前缀一(mincode,maxcode)。在数据加载110期间使用“编码值一代码”操作,以便利用对应的整数代码(即,代码)将串列的数据(即,值)编码。该操作包括已经在字典中的那些串的代码的查找和新串值的插入以及用于这些新值的保持顺序的代码的产生。在查询处理器130期间使用“解码代码一值”操作,以便使用对应的串值将批量结果解码。在查询编译120期间使用“查找(值,类型)一代码”操作,以便利用对应的整数代码重写相等谓词(例如,P.name=“全脂奶-加仑”)中或者范围谓词(例如,p_name彡“全脂奶-加仑”)中的串常量。参数“类型”指定字典是应该执行精确匹配查找还是返回下一个更小的串值的整数代码。在查询编译120期间使用“查找前缀一(mincode,maxcode),,操作,以便利用对应的整数范围(即,mincode和maxcode)重写前缀谓词(例如p_name=“全脂奶*”)的前缀。图2是示出用于对表T的属性编制索引(indexing)的直接、间接和共享树叶方法的图。表T可以通过构造表T的两个属性(值和代码)的索引来支持上述用于将串值编码和解码并且使得能够重写查询谓词的操作。在实施例中,属性“值”和“代码”的索引编制可以是直接的210或间接的220。结构200示出直接210、间接220和共享树叶230方法。在直接方法210中,创建用于编码和解码的两个索引(例如,编码索引205和解码索引215),它们在其树叶中直接保存表数据。该表不需要被保持在主存储器中,因为数据被存储在索引中,但是表数据被冗余地保存在两个索引中,这浪费存储器空间。在间接方法220中,创建用于编码和解码的编码索引和解码索引,例如编码索引205和解码索引215,用于只保存对于表数据225的引用(reference)(例如,使用行标识符“rid”235)。可以将表保持在主存储器中,而不是写入外部驱动器。尽管索引更小,但是额外的间接程度(levelofindirectness)可能导致更高的高速缓存失误率(miss-rate)。在另一实施例中,用于编码和解码的两个索引共享相同的树叶(例如共享树叶230方法),其将表数据直接保存在它们的树叶中,但是避免了直接索引编制210方法的冗余。因此,共享树叶还避免了间接索引编制方法220的额外的间接程度。由于串字典使用保持顺序的编码方案,因此表T中的串值和整数代码遵从相同的排序顺序。由于可以在树叶中按照排序顺序保持表T的两个属性值,因此树叶可以使用用于排序后的数据的标准搜索方法(例如二分搜索或内插搜索)提供对于两个查找方向(即,对于编码和解码)的访问路径。此外,如在直接索引的情况中那样,使用共享树叶来对字典编制索引意味着不必将表T显式地保持在主存储器中,因为树叶保存了表T的所有数据。图3是示出用于字典内的数据加载和查询处理的共享树叶方法的实施例的流程图。可以使用编码索引来将串值的列表编码。在过程300的块305,编码索引将串值传播(例如广播,传递等)对应的树叶(例如,如图6或图7所示)。在块310,执行用于每个单个串值的整数代码的查找。在一个实施例中,可以在树叶内经由标准搜索算法来执行查找操作。对于整数代码列表的解码类似地进行,其中,解码索引将整数代码向下传播到对应的树叶。在判定块315,该过程检查对于每个串值是否都存在整数代码。如果找到了所有串值的对应整数代码,则该过程在块330处继续。在块330,通过查找操作返回整数代码的列表(即,结果列表)。如果通过对编码索引的查找操作没有找到串值的某些整数代码,则该过程在块320处继续。在块320,通过将新的行写入表T,将没有找到其整数代码的串值插入字典。在块325,为这些串值产生新的整数代码。将用于插入新串值的代码范围划分为等距间隔。所述间隔的限界(limit)代表新代码。如果所述范围小于要插入的新串值的数目,则对某些串值进行重新编码,并且更新使用它们的数据。新产生的整数代码被添加到通过块315处的查找操作返回的代码列表。在必要时更新所述索引。在实施例中,共享树叶还支持重写字典内的谓词。为了重写相等谓词和范围谓词,编码索引将串值传播到对应的树叶,并且对树叶的搜索操作返回整数代码。为了重写前缀谓词,编码索引将前缀传播到包含用于该前缀的最小和最大串值的树叶;该树叶将最小和最大串映射到所述整数代码。该字典的数据结构(即,树叶和索引)对于将多批(bulks)编码或解码是最优化的并且是高速缓存知晓的(cache-aware)。所述操作,即编码和解码,易于并行化。树叶结构与索引结构不同。所有结构,即树叶结构和索引结构,存在于存储器中。树叶结构以排序顺序保存串值和整数代码。树叶支持可变长度的串值的编码,并且支持高效的批量加载和批量更新。用于编码和解码的索引以排序顺序保持关键码(key),以便在排序后的树叶上进行高效查找。编码索引提供了串常量和串前缀向树叶的传播。除了查找用于已经成为字典的一部分的串值的整数代码以外,可能还需要将新的串值插入字典(例如,更新树叶以及用于编码和解码的两个索引),并且产生用于这些值的新的保持顺序的代码。在实施例中,将查找和插入操作组合为一个操作。以下策略可以支持这样的方法在产生任何新的整数代码之后更新编码和解码索引的全部成批(all-bulked)的方法以及在传播串值期间更新编码索引的混合(hybrid)方法。图4是示出全部成批策略和混合策略的实施例的图。过程400示出了全部成批401策略和混合402策略的主要步骤。全部成批401策略开始于块410。在块410,使用编码索引将串值传播到对应的树叶。查找用于该树叶中的该串值的整数代码。在块420,将任何新的串值插入树叶。响应于所插入的新值而重新组织树叶层级(leaflevel)(例如,创建所有树叶都被填充到最大树叶大小的树叶层级)。在块430,产生用于新值的整数代码。在块440,从更新后的树叶层级批量加载新的编码索引和新的解码索引。混合402策略包括以下步骤。在块450,使用编码索引将串值传播到对应的树叶。在传播串值期间直接更新编码索引。在块450,查找用于该树叶中的该串值的整数代码。在块470,将任何新的串值插入树叶。产生用于新值的整数代码。在块480,从更新后的树叶层级批量加载新的解码索引。为了确保数据的一致性,在数据加载期间将索引和树叶锁定。对于查询处理,可以允许只读并发。在数据加载期间,可以将更新后的树叶依次写入存储单元。图5是根据本发明的实施例的用于可变长度的串值的树叶结构的存储器布局的示例。可以在用于在特定平台上将可变长度的串值编码和解码的共享树叶方法230中使用树叶结构500。树叶结构500将排序和压缩后的串值及其对应的固定长度的整数代码一起在存储器的一个组块(chunk)中,以便在数据加载和查找操作期间提高高速缓存局部性(locality)。对于使用该树叶结构500的查找,将偏移向量505存储在树叶的末尾,其也以排序的方式保存用于树叶的所有未被压缩的串的引用(即,偏移)和整数代码。例如,对于530处的值16,将510处的偏移128和520处的代码32000存储在偏移向量505中。将压缩后的串值的整数代码和压缩后的串值一起存储在数据部分中,而不是存储在偏移向量505中(例如,值17的代码32050)。在树叶结构数据加载期间,串值首先被压缩,然后与它们的代码一起被以正向方式(即,从存储器位置0开始并且对于每个新条目使该位置递增)写入树叶。为了使得能够搜索树叶内的串值,以未压缩的形式存储每第n个串(例如,每第三个串),并且将未压缩的串的位置作为锚(anchor)保存在树叶的末尾(以便在搜索期间被找到)。然而,当将数据加载到树叶中时,在将所有数据写入树叶之前,压缩后的串值的准确大小可能是未知的。因此,可以从最后的存储器位置起通过对于每个新锚使位置递减来以反向方式存储偏移向量505。对于批量查找,树叶结构支持一个查找操作用于查找给定串值的整数代码以及另一查找操作用于查找给定代码的串值。为了查找给定串值的代码,可以执行不需要将树叶数据解压缩的、用于在递增编码的值上进行顺序搜索的算法。在实施例中,该算法可以是如参照下面的表1描述的那样。算法1在压缩后的树叶上进行的串V的顺序搜索functionSEQUENTIALSEARCH(leaf,start,end,ν)γ'leaf[start]-—读取偏移start处的串ν’startstart+size(v')-一使偏移递增串的大小prefix_lenprefix_len(v,y')—一计算共同的前缀长度whilestart_endandprefix_len<νdocurr_prefix_lenleaf[start]_-获得当前前缀长度startstart+p-一使偏移递增前缀大小(prefix-size)=1y'leaf[start]startstart+size(v')ifcurr—prefix—IenOprefix—Ienthencontinue—_当前值ν'的前缀过短/过长elseifcompare(v',v)>Othenreturn-1—-当前值V'跟在搜索值V之后endifprefix_lenprefix_len+prefix_len(v,y')startstart+c__-使偏移递增代码大小C=4endwhileifprefix_len=νthenreturnleaf[start-c]---找到串V:返回代码elsereturn-1---没有找到串Vendifendfunction表1在压缩后的树叶上进行的串ν的顺序搜索当查找给定代码的值时,在顺序搜索期间将所述值以递增方式(incrementally)解压缩。对于批量查找,对查找探针(probe)进行排序以减小搜索开销。对于用串值列表对树叶进行的初始批量加载,首先将这些串值排序。然后,从树叶的开头起依次写入树叶数据,并且从末尾起以相反顺序写入偏移向量。如果串值没有占用为它们分配的全部存储器,则将偏移向量向前移动,并且释放未使用的存储器。对于批量更新,新串值的列表首先被排序,然后被插入现有的树叶中。然后,执行新串值和现有树叶的排序归并以便创建新树叶。在实施例中,可以在树叶结构的顶部使用高速缓存知道(cache-conscious)的索引结构来进行编码和解码。这些索引支持全部成批401策略和混合402策略。对于编码索引,定义PatriciaTrie的高速缓存敏感(CS)的版本CS数组trie(CSarraytrie),其支持混合策略402。PatriciaTrie或基数树(radixtree)是基于用来存储一组串的trie(一种前缀树,该前缀树是用来存储相关联的数组的有序树数据结构,在所述相关联的数组中,关键码通常是串)的专门设置的数据结构。与常规的trie相比,利用字符序列而不是用单个字符来标记PatriciaTrie的边。这些可以是字符串,诸如整数或IP地址的比特串,或者通常是采用字典编纂(lexicographical)顺序的任意的对象序列。此外,定义前缀B-树的新的高速缓存敏感的版本(使数据保持被排序并且对于读取和写入大批数据的系统来说最优化的树数据结构),即CS前缀树,以支持全部成批401更新策略。作为解码索弓丨,可以使用CS搜索(CSS)树。可以使用每个树叶的最小整数代码作为索引的关键码,在字典的树叶上创建CSS树。可以从字典的树叶起自下向上地高效批量加载CSS树。可以使用CS数组trie作为编码索引,以将串查找探针和更新传播到树叶。CS数组trie将读取最优化的高速缓存知晓的数据结构用于索引节点,并且不将串完全分解。图6是用于使用CS数组trie将数据编码的实施例的图。CS数组trie610节点使用数组而不是链表(linkedlist)来存储编制了索引的串值的字符。当将单个值依次插入trie中时,数组比链表效率低。但是,对于每次将新值批量插入到数组trie中,节点的数组只被扩大一次。对于CS数组trie610的串值的查找,可以执行在节点的字符上的搜索,其中,所述数组支持二分搜索,并且所有字符都被群集地存储在存储器中。CS数组trie610使用树叶结构将具有相同前缀的一组串存储在一起。例如,树叶620包括具有相同的“aa”前缀的一组串。CS数组trie树叶610存储完整的串以使得能够使用相同的树叶将整数代码高效地解码。使用递增编码将所述串压缩。在实施例中,可以使用CS数组trie来实现混合更新策略402,用于在数据加载110期间对串值进行批量编码,如630处所示。使用每个trie节点处的可变缓冲器(variablebuffer)(例如缓冲器645,650和650)将串值640(以预定顺序)传播到树叶,以便提高用于查找的高速缓存的局部性。使用每个节点处的缓冲器,对于每一批次,存储在节点处的字符数组只增长一次。这减小了高速缓存失误。为了估计预期的树叶大小,可以在缓冲器页中将所有新串的未压缩的大小以及它们的新代码(没有去除重复代码)的大小加到当前树叶大小上。当所有串值640被传播到它们的树叶时,通过分析在现有的串值640之间插入的串的数目来为新的串值产生新的整数代码660。CS数组trie支持高效的谓词重写。对于相等谓词和范围谓词,通过trie传播常量而不进行缓冲。对于前缀谓词,使用前缀来找出与其匹配的最小和最大串值。串值从trie的根向树叶的传播被并行化。通过确定哪些树叶保存相邻的新串值来并行地产生新的整数代码,而不锁定任何数据结构。也可以在不锁定任何数据结构的情况下将新串值的查找并行化。图7是根据实施例的CS前缀树的示例的图。在实施例中,可以使用CS前缀树作为编码索引来传播串查找探针和更新。CS前缀树节点包含最短的前缀,其使得能够将串值传播到子节点。取代存储指向每个孩子(Child)的指针,CS前缀树为节点分配存储器的相邻块,并且使用偏移来导航通过所述块。这减小了存储器消耗,并且防止由于指针追踪导致的性能问题。为了进一步减小树的存储器覆盖区域(footprint),仅仅显式地存储到第一个子节点730的偏移。对于固定大小的节点,可以使用偏移算术来计算到子节点的偏移。为了允许在节点的可变长度的关键码上的快速搜索,在每个节点的开头处的偏移向量中存储到关键码的偏移。节点大小被固定以允许使用偏移算术来计算到子节点的索引(i)。例如,可以在偏移ο=offset(first_child)+(i*s)处找到节点的第i个孩子。节点的孩子的数1目是可变的,因为在节点处存储可变长度的关键码。CS前缀树只能被从下向上地批量加载,因此它主要适合于全部成批的更新策略401。为了将串值的第一次批量加载编码,使用这些串值来构造完整的树叶层级。可以使用CS数组trie来将串值划分为使用多关键码快速排序而排序的桶(bucket)。然后,使用排序后的串值来创建和填充树叶720至最大树叶大小。从这些树叶720起,从下向上批量加载新的编码索引。图8是从给定的树叶层级开始的CS前缀树的批量加载过程的实施例的流程图。在块810,以前两个树叶开始,计算第一最短前缀。第一最短前缀用于区分第一树叶的最大值和和第二树叶的最小值。在块815,将第一最短前缀存储在树的节点中。因为可以计算到该树叶层级的偏移,所以不存储到每个孩子的指针。在块820,从左向右写入偏移向量,并且从右向左存储关键码(由于偏移向量的大小未知)。在块825,计算第二最短前缀。第二最短前缀用于区分第二树叶的最大值和第三树叶的最小值,如此继续进行,直到处理了所有树叶为止。在块835,如果当前树节点已满,则开始树的新节点。将索引存储到将成为作为锚的此新节点的孩子的第一个树叶。在块840,将所述节点相邻地存储在存储器存储单元中。在块845,只要对于树的给定层级创建了超过一个的节点,就在现有的树的层级顶部增加另一个层级。新的层级包括存储区分子节点的前缀的节点。该节点是树的根。在下一个存储器块中,将偏移存储到该节点。因为树是从下向上构造的,因此所述节点被以该顺序存储在存储器中。对于随后的批量加载,可以使用现有的CS前缀树将串值传播到树叶。所述串值在树叶层级上被缓冲,然后将现有的树叶与存储在缓冲器中的新串值进行排序归并。如果缓冲器中的新串值和现有树叶的值没有适配到一个树叶中,则可以创建另一树叶。可以使用CS前缀树来重写查询谓词。对于相等谓词或范围谓词,可以利用串常量来执行简单的查找。对于前缀谓词,可以使用前缀来找出与该前缀匹配的最小串值。对于前缀的查找找出包含所述值的树叶,即使该值不在字典里。从那个树叶开始,可以执行顺序搜索以找到与所述前缀匹配的最大串值。可以在相邻的块中事先分配存储器。所有树节点需要的存储器的最大量可以通过对树中的关键码的最大长度设置任意限界(limit)来计算。然后,计算适配在一个节点中的关键码的最小数目,从而计算存储数据所需的节点的最大数目。使用指针和偏移算术的混合识别出正确的孩子,从而允许使用存储器的多个块。与CS数组trie相比,CS前缀树构造起来可能更昂贵,因为数据首先被排序,然后从下向上地加载。但是,就查找工作负荷而言,CS前缀树表现得比CS数组trie好。图9是根据实施例的来自示出树叶结构的性能和存储器开销的实验的结果的图。该实验包括两个工作负荷,使得每个可以适配到16MB大小的树叶中。所述工作负荷使用不同的固定串长度,因此表示不同数目的串。所述工作负荷明显未被排序(没有偏斜(skew)),以便表示查找操作的最坏情况。将工作负荷加载到以排序顺序保存数据的一组树叶上。所使用的树叶大小从64KB到16MB不等。在没有编码和解码索引的开销的情况下测量具有不同树叶大小的不同工作负荷的成本。此外,测量当批量加载树叶910并且执行用于编码920和解码930的查找时的执行时间和高速缓存失误。为了加载树叶,首先对工作负荷进行排序,并且每个树叶被批量加载至其最大大小,然后为树叶产生整数代码。将8字12节的大小用于所述整数代码以便找出用于编码具有大的域的大小的属性的预期存储器消耗。为了测量树叶结构的查找性能,使用缓冲器将工作负荷的每个串值分配给树叶,然后在各个缓冲器中查找每个串的代码。最后,使用编码的工作负荷来执行查找以再次将整数代码解码。在实验中,将16MB的树叶结构与使用两种不同工作负荷的两个高速缓存敏感的读取最优化的索引结构进行比较。对于将串值编码,将树叶结构与紧凑链式散列表(compact-chainhashtable)进行比较(即,批量查找920)。对于将整数代码解码,将树叶结构与CSS树进行比较(即,批量查找930)。结果表明最优的树叶结构大小大约为512KB(中等),并且树叶结构的性能可与读取最优化的索引结构相比,但是使用较少的存储器。图10是根据实施例的来自示出编码索引的查找和更新成本的实验的结果的图。测量将对于索引产生不同更新模式的工作负荷(workload)编码的成本。首先,批量加载具有1000万个串的字典(批次1),然后将表示某个更新模式的1000万个串的另一批加载(批次2)编码。所有工作负荷都由具有20个字符的固定长度的串值组成。最大树叶大小被设置在512KB。在实验中,使用5个不同的更新模式。1)无更新批次2不包含新串;2)交织10批次2包含10%的新串,其中按排序顺序每第10个串是新的;3)交织50批次2包含50%的新串,其中按排序顺序每隔一个串是新的;4)交织100%批次2包含100%的新串值,每个被插入在批次1的两个值之间;以及5)附加批次2包含100%的新串值,所有新串值都被插入在批次1的最后一个串之后。该实验表明对于不同的更新模式,加载批次1然后加载批次2的时间与CS数组trie和CS前缀树相似,但是比列表trie长得多。图11是根据实施例的来自示出字典的可扩展性的实验的结果的图。该实验测试用于未经排序的不同大小的工作负荷的数据结构的性能。该结果表明使用用于字典的不同编码索引来将工作负荷编码所需的时间表现与工作负荷中的串的数目成线性比例(scaling)0在编码之后,从编码索引的树叶批量加载解码索引,并且将编码后的工作负荷解码。同样,时间表现出线性比例。为了检查并行化对CS数组trie的影响,改变线程的数目,结果表明由于线程同步的开销,在8线程情况下的性能优于16线程情况下的性能。轻量级压缩方案可以提高面向列的数据库系统的查询处理性能。在一种这样的方案中,字典利用较短的(国定长度)整数代码来代替长(可变长度)值。为了进一步提高性能,列存储器可以使用保持顺序的压缩方案。可以使用新的数据结构来支持对于具有可随时间改变的大的域的大小的可变长度串属性的保持顺序的字典压缩。可以将字典建模为表,该表将串值映射到任意整数代码。可以使用新的索引编制方法以便高效地访问这种使用压缩索引数据的字典。所述数据结构至少与其它用于字典的数据结构一样快,但是占用较少的存储器。图12是根据本发明实施例的计算机系统的示例的示意图。根据一种实现,系统1200可以用于与图3相关联地描述的操作。系统1200包括处理器1210、主存储器1220、存储单元1230和输入/输出设备1240。组件1210、1220、1230和1240中的每一个使用系统总线1250互连。处理器1210能够处理用于在系统1200内执行的指令。该处理器与主存储器存储装置1220通信。此外,该处理器可操作以执行存储在主存储器1220中的操作1280,例如数据加载110、查询编译120和查询执行130。在一个实施例中,处理器1210是单线程处理器。在另一实施例中,处理器1210是多线程处理器。处理器1210能够处理存储在主存储器1220或存储设备1230中的指令,以在输入/输出设备1240上显示用户界面的图形信息。主存储器1220存储系统1200内的信息。在一种实现中,主存储器1220是机器可读介质。在实施例中,主存储器1220以面向列的格式存储保持顺序的压缩数据。主存储器1220存储字典1260。字典1260用于如索引1270表示的压缩数据的编码和解码。编码索引和解码索引包含共享树叶数据结构,该共享树叶数据结构在其树叶中以排序后的顺序保存数据。存储设备1230能够向系统1200提供大容量存储。在一种实现中,存储设备1230是计算机可读介质。在替换实施例中,存储设备1230可以是软盘设备、硬盘设备、光盘设备或磁带设备。输入/输出设备1240用来触发或启动对于系统1200的输入/输出操作1280。在一种实现中,输入/输出设备1240包括键盘和/或指示设备。在另一实现中,输入/输出设备1240包括用于显示图形用户界面的显示单元。也可以作为用于有形地存储机器可执行的指令的有形的机器可读介质(例如计算机可读介质)来提供实施例的元素。该有形的机器可读介质可以包括但不限于闪存、光盘、CD-ROM、DVDROM、RAM、EPROM、EEPROM、磁卡或光学卡、或者适合存储电子指令的其它类型的机器可读介质。例如,可以作为计算机程序来下载本发明的实施例,可以将所述计算机程序从远程计算机(例如服务器)经由通信链路(例如调制解调器或网络连接)传送到请求计算机(例如客户端)。应当认识到,贯穿本说明书的对于“一个实施例”或“实施例”的提及是指结合实施例描述的特定特征、结构或特性被包括在本发明的至少一个实施例中。因此,所强调并且应当认识到的是在本说明书的各种位置处对于“实施例”或“一个实施例”或者“替换实施例”的两次或更多次的提及不一定都是指相同的实施例。此外,在本发明的一个或多个实施例中,可以适当地组合所述特定特征、结构或特性。在前述说明书中,已经参照本发明的特定实施例对本发明进行了描述。然而,将显而易见的是,可以对其进行各种修改和改变,而不背离如所附权利要求限定的本发明的更宽的精神和范围。因此,所述说明书和附图要被视为说明性的而不是限制性的。权利要求一种机器可读存储介质,该机器可读存储介质在其上有形地存储机器可读指令,当由机器执行时,所述机器可读指令使该机器执行包括以下各项的操作将多个串值经由编码索引传播到字典的共享树叶结构的压缩树叶数据;经由查找操作获取所述多个串值的多个保持顺序的整数代码;如果在所述获取期间没有找到所述多个整数代码的子集,则将没有找到的所述多个整数代码的子集所针对的所述多个串值的子集插入共享树叶结构;产生所述多个串值的对应子集的所述多个整数代码的子集;以及提供保持顺序的所述多个整数代码的列表,该列表包括所产生的所述多个整数代码的子集。2.如权利要求1所述的机器可读存储介质,其中,所述操作还包括将所述多个整数代码经由解码索引传播到字典的共享树叶结构;以及更新所述编码索引和解码索引。3.如权利要求1所述的机器可读存储介质,其中,所述操作还包括利用来自所述多个保持顺序的整数代码的对应整数代码,重写相等谓词或范围谓词中的来自所述多个串值的串值;以及利用来自所述多个保持顺序的整数代码的对应的整数代码范围,重写前缀谓词的串前4.如权利要求1所述的机器可读存储介质,其中,获取所述多个保持顺序的整数代码还包括对压缩后的树叶数据执行顺序搜索操作,而不将该压缩后的树叶数据解压缩。5.如权利要求1所述的机器可读存储介质,其中,所述编码索引包括高速缓存敏感的数组trie索引或高速缓存敏感的前缀树索引。6.如权利要求5所述的机器可读存储介质,其中,所述高速缓存敏感的数组trie包括将所述多个串值存储在数组中;经由每个高速缓存敏感的数组trie节点处的可变缓冲器,按照预定顺序将所述多个串值传播到共享树叶结构,以便对于每一批次只填充所述数组一次;以及并行地产生所述多个串值的对应子集的所述多个整数代码的子集。7.如权利要求5所述的机器可读存储介质,其中,所述高速缓存敏感的前缀树包括计算第一最短前缀以区分该高速缓存敏感的前缀树的第一树叶的最大值和第二树叶的最小值;计算第二最短前缀以区分第二树叶的最大值和第三树叶的最小值;以及如果在该高速缓存敏感的前缀树的一个层级中存在多于一个的节点,则在顶部增加具有存储所计算的第一和第二前缀的节点的第二层级,其中,所述节点是该高速缓存敏感的前缀树的根。8.一种计算机实现的方法,包括将多个串值经由编码索引传播到字典的共享树叶结构的压缩树叶数据;经由查找操作获取所述多个串值的多个保持顺序的整数代码;如果在所述获取期间没有找到所述多个整数代码的子集,则将没有找到的所述多个整数代码的子集所针对的所述多个串值的子集插入共享树叶结构;产生所述多个串值的对应子集的所述多个整数代码的子集;以及提供保持顺序的所述多个整数代码的列表,该列表包括所产生的所述多个整数代码的子集。9.如权利要求8所述的方法,还包括将所述多个整数代码经由解码索引传播到字典的共享树叶结构;以及更新所述编码索引和解码索引。10.如权利要求8所述的方法,还包括利用来自所述多个保持顺序的整数代码的对应整数代码,重写相等谓词或范围谓词中的来自所述多个串值的串值;以及利用来自所述多个保持顺序的整数代码的对应的整数代码范围,重写前缀谓词的串前11.如权利要求8所述的方法,其中,获取所述多个保持顺序的整数代码还包括对压缩后的树叶数据执行顺序搜索操作,而不将该压缩后的树叶数据解压缩。12.如权利要求8所述的方法,其中,所述编码索引包括高速缓存敏感的数组trie索引或高速缓存敏感的前缀树索引。13.如权利要求12所述的方法,其中,所述高速缓存敏感的数组trie包括将所述多个串值存储在数组中;经由每个高速缓存敏感的数组trie节点处的可变缓冲器,按照预定顺序将所述多个串值传播到共享树叶结构,以便对于每一批次只填充所述数组一次;以及并行地产生所述多个串值的对应子集的所述多个整数代码的子集。14.如权利要求12所述的方法,其中,所述高速缓存敏感的前缀树包括计算第一最短前缀以区分该高速缓存敏感的前缀树的第一树叶的最大值和第二树叶的最小值;计算第二最短前缀以区分第二树叶的最大值和第三树叶的最小值;以及如果在该高速缓存敏感的前缀树的一个层级中存在多于一个的节点,则在顶部增加具有存储所计算的第一和第二前缀的节点的第二层级,其中,所述节点是该高速缓存敏感的前缀树的根。15.一种计算系统,包括面向列的数据库系统;基于字典的存储单元,其指定在面向列的数据库系统中多个可变长度的串值和多个整数代码之间的映射;共享树叶数据结构,该共享树叶数据结构在其树叶中以排序后的顺序保存字典存储单元的数据;与基于字典的存储单元通信的处理器,该处理器可操作以便使用共享树叶数据结构将所述多个可变长度的串值编码为所述多个整数代码以及将所述多个整数代码解码为所述多个可变长度的串值。16.如权利要求15所述的系统,其中,所述共享树叶数据结构包括用于将所述多个可变长度的串值编码的编码索引以及用于将所述多个整数代码解码的解码索引。17.如权利要求16所述的系统,其中,所述编码索引支持将所述多个可变长度的串值传播到共享树叶、查找所述多个整数代码、以及在查找期间没有找到所述多个整数代码的子集时产生第二多个整数代码。18.如权利要求16所述的系统,还包括在共享树叶数据结构顶部使用高速缓存敏感的数组trie索引或高速缓存敏感的前缀树索引作为编码索引。19.如权利要求15所述的系统,其中,所述高速缓存敏感的数组trie索引包括用于存储所述多个可变长度的串值的数组。20.如权利要求15所述的系统,其中,所述高速缓存敏感的前缀树索引包括节点,该节点包括使得能够将所述多个可变长度的串值传播到高速缓存敏感的前缀树的子节点的最短前缀。全文摘要描述了一种方法和系统,所述方法和系统涉及使用字典在列存储器中利用固定长度的整数关键码压缩较大的一组可变长度的串值。该字典支持更新(例如新串值的插入),而不改变现有值的代码。此外,描述了一种共享树叶方法,用于对这样的字典编制索引,其压缩字典本身,同时提供用于编码和解码的访问路径。文档编号G06F17/30GK101937448SQ20101021101公开日2011年1月5日申请日期2010年6月28日优先权日2009年6月28日发明者卡斯滕·比宁格,弗朗兹·费伯,斯蒂芬·希尔登布兰德申请人:Sap股份公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1