专利名称::存储和访问数据,以及提高数据库查询语言语句性能的方法和机制的制作方法
技术领域:
:本发明涉及数据库管理系统领域。更具体地,本发明涉及在计算机系统中存储和检索数据,以及提高数据库查询语言语句的性能的方法和机制。
背景技术:
:随着许多现代商业和组织对访问更为大量信息的需求的增加,必须存储在数据库和计算机系统中的数据量也在增加。存储大量信息的费用的一个重要部分与购买和维护数据存储系统的成本有关。给定这样的费用,建议采用适当的方法来减少存储给定数据量所需要的空间量。数据压缩是在许多现代计算机系统中用来减少数据的存储成本的一种技术。实现压缩的一种普通方法是以文件的粒度(granularity)压缩数据。例如,常规压缩方法,如基于Unix的gzip和基于DOS的zip,将整个文件压缩成该文件的更加紧凑版本。这种类型的方法的缺点是,如果整个文件被压缩,那么在使用其任何一部分之前,必须解压缩全部文件或大部分文件,即使是用户实际上只需要很小的一部分。特别对于压缩数据库系统中的文件存在问题,其中单个数据库文件可能包含大量的数据库记录,但是在任何时候可能只需要各个记录的一小部分。于是压缩或解压缩的粒度可能实际上并不与在系统中期望使用和访问数据的粒度匹配。然而,以其它粒度压缩可能导致存储效率低下。例如,某些一次一页的压缩方法可能会导致压缩页面大小不同,其映射到物理页面的效率低下。另外,许多常规压缩技术甚至不能保证压缩后数据大小不会增加。而且,压缩和解压缩数据这样的操作可能会消耗大量的系统开销。系统开销典型地与所使用的具体压缩算法以及被压缩和解压缩的数据量相关。当试图在数据库系统中存储、检索、或更新信息时,该系统开销就使等待时间显著地增加。例如某些压缩技术将压缩信息与被压缩的数据分开存储。因此,对于简单的读访问,就需要访问数据库中的多个位置,并且可能需要进行复杂的解压缩操作。给定等待时间问题,以及低于某一压缩增益,在数据库或其它类型的计算系统中,压缩的时间和空间之间的权衡并不总是令人满意。因此需要一种压缩技术,其不仅会使得减少所使用的磁盘空间,而且对查询压缩数据的数据库查询语言语句的性能没有负面影响。
发明内容本发明提供一种存储和检索压缩格式的数据的方法和机制。在一个实施例中,通过减少或去除在数据块或其它存储单元中的重复数据值,对所存储的数据进行数据压缩。在另一个实施例中,保持有描述该数据块内的数据重复的信息。本发明也提供一种用于改进数据库查询语言语句的性能的方法和机制。在一个实施例中,维护并使用所保持的数据重复信息,以减少谓词(predicate)评估的数目。在另一个实施例中,使用该数据重复信息以减少通过数据库查询语言语句访问的数据的量。下面在说明书、附图和权利要求中对本发明的各方面、目的和优点进行更详细的描述。前面的一般性说明和下面的详细说明都是示范性的和解释性的,并不意欲对本发明的范围进行限定。所包括的附图与发明详述一起提供对本发明更进一步的理解,并且用于解释本发明。图1所示为根据本发明实施例的数据存储结构。图2所示为存储数据过程的实施例的流程图。图3所示为检索数据过程的实施例的流程图。图4描述了根据本发明实施例的符号表格中的条目的递归引用。图5描述了根据本发明实施例的符号表格中的条目的递归引用和列的重新排序。图6所示为存储数据过程的可选实施例的流程图。图7描述了根据本发明实施例的NULL尾值的删除。图8描述了根据本发明实施例的NULL尾值的删除和列的重新排序。图9所示为根据本发明的实施例,将解压缩的数据块转换成压缩数据块的过程。图10的流程图为根据本发明的实施例,提高数据库查询语言语句性能的方法。图11说明了根据本发明的实施例,保持数据重复信息的过程。图12描述了根据本发明一个实施例的数据重复信息的保持。图13所示的流程图为根据本发明的另一个实施例,保持数据重复信息的方法。图14描述了根据本发明的一个实施例,对数据重复信息的更新。图15的处理流程为根据本发明的实施例,提高数据库查询语言语句性能的方法。图16所说明的流程图为提高数据库查询语言语句性能的另一个方法。图17描述了根据本发明的一个实施例,数据库查询语言语句的性能是如何提高的范例。图18所示的处理流程为根据本发明的另一个实施例,提高数据库查询语言语句性能的方法。图19说明的是根据本发明的实施例,减少通过数据库查询语言语句访问的数据量的过程。图20为根据本发明的一个实施例,如何可以使用数据重复信息来提高数据库查询语言语句的性能的范例。图21描述的流程图为根据本发明进一步实施例的提高数据库查询语言语句性能的方法。图22为根据本发明的一个实施例,如何可以使用数据重复信息来满足数据库查询语言语句的范例。图23为可以用来实施本发明实施例的计算机系统的框图。图24所示为根据本发明实施例的查找树的范例。具体实施例方式本发明公开了从数据存储系统存储和检索数据。不是以文件级别或某一其它粒度压缩数据,这类数据压缩可能会导致存储效率低下和/或增加数据库查询语言语句的执行时间,而是通过减少或去除数据块或其它存储单元中的重复值来实现数据压缩。本发明还公开了提高数据库查询语言语句的性能。通过保存描述数据块内的数据重复的信息(以前在每次访问数据块时都必须对其重新计算),可以使用数据重复信息来提高数据库查询语言语句的性能。数据库查询语言语句常被用于创建、查找、访问、检索、修改、组织、维护、操作、定义、控制、添加、和/或删除数据库中的数据和结构。一种流行的数据库查询语言称为结构化查询语言(SQL)。只用于解释目的,而不是通过限制的方式,特别参考包括SQL的数据库语句进行下面的说明。整个文章中所使用的术语“盘”和“盘系统”指的是数据存储系统。此处所公开的发明概念也可以应用于除了基于盘的系统之外的其它类型的存储系统。另外将关于从数据库中存储或检索关系数据做出下面的说明。然而要注意到,本发明可以用于在计算机系统中管理其它类型和粒度的数据,于是本发明并不局限于压缩关系数据。根据本发明的实施例,对将要存储在特定数据存储单元内的一组数据内的重复值做出标识。不是将所有的这些重复数据值写入到该数据存储单元,而是创建一个符号表来存储每一重复的数据值的一个拷贝。重复数据值的每一次出现被配置成引用该符号表中的对应的重复数据值。如此处所述,数据存储单元被显示为数据块或盘页面。然而,也可以使用其它数据存储单元。在一个实施例中,数据块是自含式的,例如,重新创建数据块中的解压缩数据所需要的信息在该数据块内可获得。图1所示的数据库表格100将要被存储到盘112上的块114内。表格100中的每一行包括4列信息,包括“序号”列120、“客户”列122、“项目”列124、和“价格”列126。表格100中显示有3行数据。行102a在“序号”列120的值为“1251”、在“客户”列122的值为“Joe”、在“项目”列124的值为“Book”、并且在“价格”列126的值为“10”。行104a在“序号”列120的值为“1252”、在“客户”列122的值为“Tom”、在“项目”列124的值为“Book”、并且在“价格”列126的值为“10”。行106a在“序号”列120的值为“1253”、在“客户”列122的值为“Joe”、在“项目”列124的值为“Tape”、并且在“价格”列126的值为“20”。注意到,值“Joe”在行102a和106a的“客户”列122重复。类似地,值“Book”在行102a和104a的“项目”列124重复。值“10”在行102a和104a的“价格”列126重复。创建符号表110以存储每一重复的数据值。特别地,重复值“Joe”存储在符号表条目(entry)130中,重复值“10”存储在符号表条目132中,并且重复值“Book”存储在符号表条目134中。当表格100中的每一行数据存储到盘112上的块114时,重复的数据值不再写入盘中。相反,例如使用指针或链接结构,每一行的相应部分被配置成引用包含正确数据值的符号表110中的适当符号表条目。为了示意起见,考虑表格100中的行102a。行102a包括下面的列值“1251”、“Joe”、“Book”和“10”。注意到,符号表110包括用于值“Joe”、“Book”和“10”的条目,它们是出现在行102a中的表格100中的重复数据值。当将行102a写到盘时,只有唯一值“1251”单独地写到盘。这在盘上行结构102中b显示,对应于表格100中行102a。盘上行结构102b包括对应于行102a中的“序号”列120的第一部分142,其包括唯一数据值“1251”。对于重复数据值,可以将指针或链接插入到盘上行结构的适当部分,以指向符号表110中的适当条目。盘上行结构102b包括对应于行102a中的“客户”列122的部分144,其被配置成包括指向符号表条目130的指针136,其与行102a的“客户”列122中的重复数据值“Joe”匹配。盘上行结构102b还包括对应于行102a中的“项目”列124的部分146,其被配置成包括指向符号表条目134的指针138,其与行102a的“项目”列124中的重复数据值“Book”匹配。盘上行结构102b进一步包括对应于行102a中“价格”列126的部分148,其被配置成包括指向符号表条目132的指针140,其与行102a的“价格”列126中的重复数据值“10”匹配。表格100中的行104a和106a在被存储到盘112上的块114内时的表现相似。于是,表格100中的行104a作为盘上行结构104b被写到盘。行104a的唯一数据值“1252”和“Tom”被单独地写入盘上行结构104b中。行104a还包括分别列124和126中的重复行值“Book”和“10”。对应于行104a中列124的盘上行结构104b的部分150被配置成包括指向符号表110中的条目134的指针154,其与重复数据值“Book”匹配。对应于行104a中列126的盘上行结构104b的部分152被配置成包括指向符号表110中的条目132的指针156,其与重复数据值“10”匹配。表格100中的行106a作为盘上行结构106b被写入盘。在行106a中,唯一数据值是“1253”、“Tape”和“20”,它们被单独地写入到盘上行结构106b中。行106a还包括列122中的重复行值“Joe”。对应于行106a中列122的盘上行结构106b的部分160被配置成包括指向符号表110中的条目130的指针162,其与重复数据值“Joe”匹配。图2示出用于将数据存储到盘上的过程的实施例流程图。在202,收到将数据存储到盘上的请求。在一个实施例中,是否压缩数据是用户或系统选择的一个选项。如果选择压缩,那么在204,就对将要存储到给定数据块中的数据的各部分进行数据分析以标识重复数据值。根据所标识的数据重复,创建一个符号表,其包括某些或全部重复数据值(206)。从而创建了该数据块中的每一盘上行结构。盘上行结构被格式化以排除某些或全部重复数据值(208)。特别地,与重复数据值相关联的盘上行结构被设置成引用存储关系数据值的符号表中的一个或多个适当条目。如果离线执行该压缩方法,那么就以批处理模式执行行的分析和格式化,使得数据库块的全部内容在写到盘之前被预先组织过。离线处理使得可以精确地确定填入给定数据块的行数。可替换地,可以在线执行该压缩方法,单独地准备每一盘上行结构,并将其写到盘上。在任何一种情况下,设置块元数据以指示该块中的数据、或该块中的部分数据是否已经被压缩。在一个实施例中,块的首部包括指示该块或该块中的数据是否已经被压缩的数据结构。在一个实施例中,单个比特足以用于指示该块中的数据是否被压缩。在另一个实施例中,不是在数据被装载到数据块中时将数据压缩,而是将未压缩的数据块转换为压缩数据。如图9中所示,对数据块进行分析,以标识重复数据值(9002)。根据所标识的数据重复,创建包括某些或全部重复数据值的符号表(9004)。将该符号表中数据值的某些或全部重复从该数据块中去除或删除(9006)。然后数据块中的盘上行结构被配置成引用存储该关系数据值的符号表中的一个或多个适当条目(9008)。如果单个块内数据重复的可能性较低,那么所期望的压缩比也可能较低。如果这种重复的可能性较高,则所期望的压缩比也可能较高。于是,可以对行进行重组以增加这种重复的可能性。对于单列表格,这样做的一种方法就是按照列值对表格的行进行排序。在结构化查询语言(SQL)中,这可以通过执行带有排序子句(clause)的语句“CREATETABLEASSELECT”实现。通过按照较低基数(cardinality)列对表格的行进行排序,也可以将这种类型的技术应用于一列基数较低,而其它列的基数较高的表格。对于具有多个较低基数列的表格,可以通过首先确定具有最低基数的列来执行调节以实现更好的压缩比。可以通过执行语句“SELECTCOUNT(DISTINCT(c))fromT;”来确定列的基数。一旦确定了最低基数的列(假定为列C1),对于所选列的固定值,就确定了其它列的基数。对于除了C1之外的所有列cK,其可以通过执行语句“SELECTSUM(count(*)*COUNT(DISTINCT(cK)))fromTgroupbyC1”测得。假定列C2具有最低的这种测量值。于是在固定了头2列之后确定具有最低基数的列。对于除了C1和C2之外的所有列cK,可以通过执行语句“SELECTSUM(count(*)*COUNT(DISTINCT(cK)))fromTgroupbyC1,C2”测得。通过继续进行该过程,就可以确定某个列序列Cl,C2,...,Cn。该序列可以用作创建表格压缩语句的ORDEREDBY子句中的列序列。图3示出了用于从盘检索数据的过程的实施例的流程图。在302,接收到从盘检索数据的请求。在304,标识正被搜索的特定块或行。可以使用任何常规的定索引或查找技术来执行操作304。在306,判定该关系数据库块是否以压缩格式存储。在一个实施例中,访问该块的首部来做出该判定。如果块没有被压缩,那么就立即从盘检索该请求的行信息(310),并返回到请求实体(312)。如果块被压缩,那么就访问所请求行的关系盘上行结构,以从符号表中检索重复数据值(308)。另外,也从盘上行结构检索单独存储的数据值(310)。在312,将该组完整的请求数据返回到请求实体。在符号表中可以使用递归符号条目。递归符号条目是在符号表中本身引用一个或多个其它符号表条目的条目。图4示意了使用递归符号条目对数据块格式化,以存储图1的表格100。类似于图1的符号表110,递归符号表410包括存储数据值“Joe”的条目430、存储数据值“10”的条目432、和存储数据值“Book”的条目434。与图1的符号表110有所不同,递归符号表410包括引用符号表410内其它条目的递归符号表条目480。特别地,递归符号表条目480包括第一部分482,其与指向条目434中的数据值“Book”的链结486相关联。递归符号表条目480也包括第二部分482,其与指向条目432中的数据值“10”的链接488相关联。通过组合第一部分482和第二部分484,条目480逻辑地创建了顺序包括两个引用数据值的条目,即在数据值“10”之前直接具有数据值“Book”。通过这种方式组合多个条目的一个优点是,对于存储在块中的行,存在可能与这些组合匹配的列值序列。在盘上行结构与符号表中的单个数据值之间不是具有多个链接或指针结构,而是可以使用单个链接或指针结构来指向递归地链接到多个其它条目的组合条目。参照图1的表格100,行102a和行104a中的列124和126依次具有数据值“Book”和“10”。在图1中,盘上行结构102b(其对应于行102a)包括指向数据值“Book”的链接138,和指向数据值“10”的单独链接140。类似地,盘上行结构104b(其对应于行104a)包括指向数据值“Book”的链接154,和指向数据值“10”的单独链接156。从这些盘上行结构到符号表110中的条目共有4个链接。在图4的递归方法中,盘上行结构402b(对应于行102a)包括要单个链接472,其指向由递归符号表条目480表示的组合的顺序数据值“Book”和“10”。这使得可以使用单个链接或指针结构表示盘上行结构402b中的两部分446和448的值(对应于行102a的列124和126)。类似地,盘上行结构404b(对应于行104a)包括单个链接476,其指向由递归符号表条目480表示的组合的顺序数据值“Book”和“10”。这同样使得可以使用单个链接或指针结构表示盘上行结构404b中的两部分450和452的值(对应于行104a的列124和126)。最终结果就是,图4的方法在盘上行结构与符号表之间所需要的链接或指针比图1的方法所需的少。图4减少链接或指针的数目的方法也可以采用符号表410中的非递归组合条目。特别地,可以配置条目480,使得部分482明确地存储数据值“Book”,而不是将其与指向条目434的递归链接486相关联。也可以配置条目480的部分484以明确地存储数据值“10”,而不是将其与指向条目432的链接488相关联。该方法还可以减少盘上行结构与符号表410之间的链接数目,但代价是可能会增加在符号表410中明确地存储重复数据值所需要的盘空间量。符号表410中的条目也可以包括各种递归链接的组合,和明确存储的数据值。虽然图4所示的范例只有2个数据值组合为递归符号条目480,但是可以扩展该发明概念,以在组合符号表条目中包括任何数目的数据值。在一个实施例中,可以进行列的重新排序以提高压缩比。如在最后章节中所提到的,对于存储在给定块中的行,如果存在重复的列值序列,那么可以通过创建指向符号表中的组合条目的链接,来减少符号表与盘上行结构之间的链接数目。可以进行列的重新排序,以增加列值的重复序列的数目。在一个实施例中,可以以数据块的粒度级别进行列的重新排序。或者,可以以其它粒度进行列的重新排序,例如跨多个块进行。为了示意,考虑图5中所示的数据库表格600。表格600包括3行数据,每一行具有“序号”列、“价格”列、“项目”列、和“数量”列。行602a具有如下数据值序列“1254”、“5”、“Book”和“2”。行604a具有如下数据值序列“1255”、“10”、“Tape”和“3”。行606a具有如下数据值序列“1256”、“10”、“Movie”和“3”。考虑列没有重新排序的第一种情况。注意到数据值“10”和“3”在这些行中重复。于是,当将该表格写到盘680时,可以创建符号表650,其具有第一条目652,数据值为“10”,第二条目654,数据值为“3”。当将行602a、604a和606a写到盘时,与这些重复数据值相关联的这些行的每一盘上行结构被配置成引用符号表650中的适当条目。于是对应于行604a的盘上行结构604b具有部分641(对应于“价格”列中的数据值),其与指向符号表650中数据值“10”的条目652的链接640相关联。盘上行结构604b也具有部分643(对应于“数量”列中的数据值),其与指向符号表650中数据值“3”的条目654的链接642相关联。对应于行606a的盘上行结构606b具有部分645(对应于“价格”列中的数据值),其与指向符号表650中数据值“10”的条目652的链接646相关联。盘上行结构606b也具有部分647(对应于“数量”列中的数据值),其与指向符号表650中数据值“3”的条目654的链接644相关联。因为行602a并不包括任何重复数据值,因此其相关联的盘上行结构602b明确地存储每一列值,并且不包括到符号表的任何引用。考虑如果对表格600进行列的重新排序。对表格中的行执行列的重新排序,以增加列值的序列重复的可能性。在本范例中,通过交换表格600中“项目”列和“数量”列之间的顺序,可以看到在“价格”列与“数量”列之间出现了值的序列的重复。这种列的重新排序的结果如图5中的表格620所示。特别地,对于“价格”和“数量”列,现在行624a与626a都具有相同序列的数据值“10”和“3”。于是,当在盘682上创建符号表660时,可以插入组合条目666,其对于行624a和626a,在表格620中所示的序列中直接或间接地包括数据值“10”和“3”。如果组合条目666间接地包括这些值,那么条目666包括递归地引用条目662的第一部分668,和递归地引用条目664的第二部分670。当将行624a写到盘时,其盘上行结构624b与指向序列值“10”和“3”的组合条目666的单个链接632相关联。这与盘上行结构604b所采用的方式相反,后者对于相同的行没有进行列的重新排序,使用两个链接640和642来引用相同的两个数据值。同样的,当将行626a写到盘时,其盘上行结构626b与用于序列值“10”和“3”的单个链接636相关联。这与盘上行结构606b所采用的方式也相反,后者对于相同的行没有进行列的重新排序,使用两个链接646和644来引用相同的两个数据值。图6示出了利用列的重新排序将数据存储到盘的过程的实施例的流程图。在602接收到将数据存储到盘上的请求。如果压缩开启,那么在604就对将要存储到给定数据块内的数据部分进行数据分析以标识重复的数据值。该数据分析也包括对可能的列的重新排序组合进行分析,执行其可以用来增加数据值的序列重复的可能性。对是否存在可能有利地通过列的重新排序而获得的列序列做出判决(606)。如果存在,那么就对适当的列进行重新排序(608)。根据所标识的数据重复,创建包括某些或全部重复数据值的符号表(610)。从而创建了该数据库块中的每一盘上行结构,并且将其格式化以排除重复数据值(612),并将其写到盘(614)。特别地,与重复数据值相关联的每一盘上行结构被设置成包括或引用指向符号表中存储关系数据值的一个或多个适当条目的链接。设置块元数据以指示该块中的数据、或该块中的部分数据是否已经被压缩。另外,也设置块元数据,以指示是否和如何对所存储的数据执行列的重新排序。在一个实施例中,块的首部包括指示该块或该块中的数据是否被压缩和/或被重新排序过的数据结构。当从该块中检索到数据的时候,访问该首部信息以能够对该数据重新排序,和未压缩地回到其原始形式。可以进行优化,从存储行的盘上版本中除去NULL尾值。数据库表格中的行可以在行的末尾处的一列或多列中包括NULL值。当将这些行写到盘时,通过对于这些NULL值不分配、或不写任何空间到盘中,可以实现附加的压缩。相反,设置该存储系统以识别如果特定数据库行的盘上版本在该行的末尾并不包括列的一个或多个存储值,那么这些列值被假定为NULL值。为了示意起见,考虑图7的表格700,其将被存储到盘720上的块722。注意到,行702a和706a在行的最后一列都具有NULL值。当将这些行写到盘720时,这些行的盘上行结构被配置成排除NULL尾值。对应于行702a的盘上行结构702b并不包含为“首选”列中的NULL尾值分配的空间。相反,其只包括为出现在行702a中前导值“1260”、“Tom”和“10”分配的空间。对应于行706a的盘上行结构706b并不包含为NULL尾值分配的空间。相反,其只包括为出现在行706a中前导值“1262”、“Harry”和“30”分配的空间。可以执行列的重新排序,以增加NULL尾值在要存储到盘的行中出现的可能性。分析一组数据的列值,以根据每一列中NULL值的数目对该列分类。重新排序该列,使得具有较多NULL值的列排在行的末尾,而具有越少NULL值的列排在越靠近行的开始。于是,具有最多NULL值的列会被重新排序到表格的末尾。具有其次多NULL值的列会被重新排序到表格的次尾,按照这样的顺序继续,直至得到有效排序的列。为了示意如果不进行列的重新排序可能会出现的效率低下,参照图8中的表格800。表格800包括要被写到盘的一组行802a、804a和806a。每一行包括一个或多个NULL值。行802a和806a在“样式”列和“首选”列中包括NULL值。行804a在“样式”列中包括NULL值。由于这些行中的NULL值都不是结尾的NULL,当将这些行写到盘时,由于NULL值可能会在每一对应的盘上行结构中浪费空间。如图所示,对应于行802a的盘上行结构802b包括两个空间810和812,其分配给对应于行802a的“样式”和“首选”列中的值的NULL值。对应于行804a的盘上行结构804b包括空间814,其分配给对应于行804a的“样式”列中的值的NULL值。对应于行806a的盘上行结构806b包括两个空间816和818,其分配给对应于行806a的“样式”和“首选”列中的值的NULL值。可以执行列的重新排序,以增加将表格800存储到盘的压缩效率。第一步是将列分类,以标识具有较多NULL值的特定列。这里可以看到,表格800中的“样式”列具有最多的NULL值(每一行都是NULL值)。“首选”列具有其次多的NULL值(行802a和806a中是NULL值)。其它列都不包括NULL值。对这些列进行重新排序,将具有越多NULL值的列放在越靠近行的末尾。表格900示意了对表格800执行该操作得到的结果。特别地,重新排序这些列,使得具有最多NULL值的“样式”列放置在行的末尾。具有其次多NULL值的“首选”列放置在列序列中的次尾。由于其它列都不包含NULL值,它们都不重新排序。这种类型的重新排序使表格中的NULL尾值数量最多。现在,分别对应于表格800中行802a和806a的行902a和906a都包括两个NULL尾值。行802a和806a都不包含任何NULL尾值。表格900中的行904a对应于表格800中的行804a,其包括一个NULL尾值。行804a并不包含任何NULL尾值。当将表格900中的行902a、904a和906a写到盘时,可以从每一行的盘上版本中去除NULL尾值。于是,对应于表格900中的行902a的盘上行结构902b排除了“首选”和“样式”列的NULL值。盘上行结构902b只包括3个字段,用于分别存储“序号”、“客户”和“价格”列的数据值“1270”、“Tom”和“5”。相反,盘上行结构802b等同于在进行列的重新排序之前,其包括5个字段,用于分别存储“序号”、“客户”、“样式”、“首选”和“价格”列的数据值“1270”、“Tom”、“NULL”、“NULL”和“5”。盘上行结构904b对应于表格900中的行904a,其排除了“样式”列的NULL值。盘上行结构904b只包括4个字段,用于分别存储“序号”、“客户”、“价格”和“首选”列的数据值“1271”、“Dick”、“10”和“GroundShip”。相反,盘上行结构804b等同于在进行列的重新排序之前,其包括5个字段,用于分别存储“序号”、“客户”、“样式”、“首选”和“价格”列的数据值“1271”、“Dick”、“NULL”、“GroundShip”和“10”。类似于盘上行结构902b,对应于表格900中的行906a的盘上行结构906b排除了“首选”和“样式”列的NULL值。盘上行结构906b只包括3个字段,用于分别存储“序号”、“客户”和“价格”列的数据值。相反,盘上行结构806b等同于在进行列的重新排序之前,其包括5个字段,用于分别存储“序号”、“客户”、“样式”、“首选”和“价格”列的数据值。图10中所示是提高数据库查询语言语句性能的方法。在1002,保持有描述数据块中数据重复的信息。如前所述,有几个方法可以保持数据重复信息,例如使用符号表。为了保持该数据重复信息,并不需要压缩数据块内的数据。在1004,对于数据块中的数据接收带有至少一个谓词的数据库查询语言语句。使用该数据重复信息降低谓词评估的数目(1006)。通过减少谓词评估的数目,就提高了数据库查询语言语句的性能。图11中所示为一种保持数据重复信息的方法。标识一个或多个重复数据值(1102),并计算每一重复数据值出现的次数(1104)。在符号结构的条目中存储每一重复数据值及其相应的出现次数(1106)。从数据块中去除或删除至少一个重复数据值的一次或多次出现(1108)。对应于所去除的出现的数据块部分被配置成引用适当的符号结构条目(1110)。可以使用链接或指针来引用该适当的符号结构条目。图12中描绘了维持数据重复信息的范例。盘1202上的数据块1204包含4个盘上行结构1206-1212。每一盘上行结构对应于表格中的一行(未示出)。在数据块1204中标识两个重复数据值“HR”和“LA”,并将其连同每一重复数据值出现的次数一起存储在符号结构1214中。在实施例中,符号结构1214连同行结构1206-1212一起存储在数据块1204中。数据值“HR”出现两次一次在行结构1206的部分1216中,一次在行结构1208的部分1220中。数据值“LA”出现三次一次在行结构1206的部分1218中,一次在行结构1210的部分1222中,还有一次在行结构1212的部分1224中。如图12中所示,删除数据块1204中的重复数据值,并且部分1216-1224被配置成引用符号结构1214中的适当条目。图13示意了保持数据重复信息的另一个方法。在1302,标识一个或多个重复数据值。计算每一重复数据值出现的次数(1304)。在符号结构的条目中存储每一重复数据值及其相应的出现次数(1306)。当添加或删除一个重复数据值的出现时,更新该重复数据值出现的次数(1308)。当该符号结构条目中重复数据值的出现次数为零时,去除该符号结构条目(1310)。在图14中,关于盘1402上的数据块1404的数据重复的信息保持在符号结构1406中。在范例中,盘上行结构1416的部分1418从数据值“LA”更新为数据值“SF”。相应的,符号结构1406中的条目1420对应于重复数据值“LA”,将其更新以反映出将数据值“LA”从数据块1404中删除。图15中所示的实施例为提高数据库查询语言语句性能的方法。在1502,保持数据重复的信息。接收数据库查询语言语句(1504)。该数据库查询语言语句包括至少一个谓词。在重复数据值上至多对谓词进行一次评估(1506)。图16示意的处理流程是提高数据库查询语言语句性能的另一个方法。在该实施例中,保持数据重复信息(1602)。接收带有至少一个谓词的数据库查询语言语句(1604),并访问数据值(1606)。在该数据值上评估该至少一个谓词之前,判定以前是否已经在该数据值的重复上评估过该谓词(1608)。如果以前还没有在该数据值的重复上评估过该谓词,就在该数据值上评估该谓词(1610)。如果以前已经在该数据值的重复上评估过该谓词,就使用先前谓词评估的结果,而不是在该同一数据值上评估该谓词(1612)。图17中所示的范例为如何可以提高数据库查询语言语句的性能。针对表格1704中的数据接收数据库查询语言语句1702。数据库查询语言语句1702搜索以查找表格1704中满足谓词1706的所有记录,即数据库查询语言语句1702搜索以查找表格1704中在列1708中具有数据值“LA”的所有记录。首先访问行1710。由于还没有任何先前的谓词评估,在行1710中的数据值1718上评估谓词1706。将谓词评估的结果存储在上下文1726中。由于该谓词评估的结果是真,返回行1710。然后访问行1712。在行1712中的数据值1720上评估谓词1706之前,判定以前是否已经在该数据值1720的重复上评估过谓词1706。在一个实施例中,检查上下文1726,以确定是否存在数据值1720的重复——数据值“DC”的先前谓词评估结果。由于谓词1706先前被评估所基于的仅有数据值是“LA”,所以在数据值1720上评估谓词1706。将谓词评估的结果存储在上下文1726中。由于该谓词评估的结果是假,不返回行1712。接着访问行1714。在行1714中的数据值1722上评估谓词1706之前,判定以前是否已经在数据值1722的重复上评估过谓词1706。由于上下文1726包括对数据值“LA”的先前谓词评估结果,其是数据值1722的重复,所以不在数据值1722上评估谓词1706。相反,使用上下文1726中的先前谓词评估结果。由于谓词评估的结果是真,返回行1714。以类似的方式访问和处理行1716。这样,由于只是在2个数据值上、而不是在4个数据值上评估谓词1706,提高了数据库查询语言语句的性能。图18中所述是根据本发明的一个实施例,提高数据库查询语言语句的性能的方法。保持数据块中数据重复的信息(1802)。在1804,接收带有至少一个谓词的数据库查询语言语句。使用该数据重复信息,减少谓词评估的次数(1806)和被数据库查询语言语句访问的数据量(1808)。图19说明了一种减少被数据库查询语言语句访问的数据量的方法。在1902计算该谓词评估为真所基于的数据值的总数。然后在1904设置计数器等于所计算的该总数。访问数据值(1906),并且在该数据值上评估该谓词(1908)。如果谓词评估的结果是假,那么该过程返回,并在1906访问另一个数据值。如果谓词评估的结果是真,那么该计数器减1(1910)。在1912,判定计数器现在是否等于零。如果该计数器不等于零,那么该过程返回到1906,并访问另一个数据值。如果该计数器等于零,那么该过程就结束。在图20中所示为如何使用数据重复信息来提高数据库查询语言语句的性能的范例。在图20中,针对表格2004中的数据接收到数据库查询语言语句2002,将其存储在数据块2006中。数据库查询语言语句2002搜索以查找并返回表格2004的所有行,表格2004在“办公室”列2016中包括数据值“LA”。表格2004包括10行4列——“ID”列2010、“姓名”列2012、“部门”列2014和“办公室”列2016。在“ID”列2010和“姓名”列2012中都没有重复数据值。“部门”列2014和“办公室”列2016分别具有3个重复数据值。在图20的实施例中,数据重复信息存储在符号表2008中。符号表2008包括表格2004中每一重复数据值的拷贝,以及该重复数据值出现的对应次数。符号表2008中的每一条目也包括条目编号,其可以在数据块2006中用来引用符号表条目。如图20中所述,使用对应的符号表条目编号、而不是指向对应符号表条目的指针或链接代替重复数据值在数据块2006中的每次出现。为了评估数据库查询语言语句2002,访问数据块2006中的行结构2018b,其对应于表格2004中的行2018a。行结构2018b的部分2020对应于行2018a的列2016,由于其饮用符号表2008中的条目编号#3,所以从符号表2008中检索重复数据值“LA”,并针对数据库查询语言语句2002中的谓词进行评估。将谓词评估的结果存储在上下文2024中。然后将计数器2026设置为“3”,其等于重复数据值“LA”在表格2004中出现的次数,由于“LA”是其中谓词评估为真的仅有数据值。然后返回表格2004的行2018a,并且计数器2026减1。当计数器2026变为零时,数据块2006的顺序行访问可以结束,因为已经返回了满足该数据库查询语言语句的最大数目的行。接着访问数据块2006中的行结构2028b,其对应于表格2004中的行2028a。行结构2028b的部分2030对应于行2028a的列2016,其引用符号表2008中的条目编号#4。在从符号表2008中检索重复数据值“DC”,并针对数据库查询语言语句2002中的谓词进行评估之前,检查上下文2024,以确定是否存在条目编号#4的先前谓词评估结果。由于上下文2024并不包含条目编号#4的先前谓词评估结果,所以从符号表2008中检索重复数据值“DC”,并针对数据库查询语言语句2002中的谓词进行评估。然后将谓词评估的结果存储在上下文2024中。因为谓词评估的结果是假,所以不返回行2028a,并且计数器2026不减小。访问数据块2006中的行结构2032b,其对应于表格2004中的行2032a。行结构2032b的部分2034对应于行2032a的列2016,其引用符号表2008中的条目编号#3。由于上下文2024已经包含条目编号#3的先前谓词评估结果,所以并不需要再次评估该谓词。假定条目编号#3的先前谓词评估结果是真,那么返回行2032a,并且计数器2026减1。访问数据块2006中的行结构2036b,其对应于表格2004中的行2036a。类似于行结构2032b的部分2034,行结构2036b的部分2038对应于行2036a的列2016,其引用符号表2008中的条目编号#3。由于上下文2024已经包含条目编号#3的先前谓词评估结果,所以并不需要再次评估该谓词。假定条目编号#3的先前谓词评估结果是真,那么返回行2036a,并且计数器2026减1。然后结束数据块2006的顺序行访问,因为所有满足数据库查询语言语句2002的行都已经返回。在图20中所示的范例中,不仅谓词评估的次数从4减为2,而且所访问的行数也从10减少到4,其是使用数据重复信息的结果。于是,通过保持数据块内数据重复的信息可以大大地提高数据库查询语言语句的性能。由于在图20中只有唯一一个数据值可以满足数据库查询语言语句的谓词,通过简单地查看符号表2008,就可以计算该数据块中谓词评估为真所基于的数据值的总数。当不止唯一一个数据值满足数据库查询语言语句的谓词时,通过累加数据块中满足该谓词的每一唯一数据值出现的次数,计算该数据块中谓词评估为真所基于的数据值的总数。例如,如果3个不同的唯一数据值X、Y和Z满足该谓词,并且X在数据块中出现5次,Y在数据块中出现8次,Z在数据块中出现3次,那么数据块中谓词评估为真所基于的数据值的总数等于5加8加3,等于16。因此,图20中的计数器2026设置为16,并且每次返回满足的数据时减1。所以,可以显著地减少满足数据库查询语言语句所访问的数据量。图21所述的处理流程是提高数据库查询语言语句性能的另一个方法。保持数据块中数据重复的信息(2102)。在2104,接收带有至少一个谓词的数据库查询语言语句。使用该数据重复信息减少谓词评估的次数(2106)。另外,不是访问数据值来满足该数据库查询语言语句,而是更新该数据重复信息(2108)。图22中所示的范例为如何可以通过更新数据重复信息、而不是通过访问数据值来满足数据库查询语言语句。针对表格2204接收数据库查询语言语句2202,其存储在盘2208的数据块2206中。数据库查询语言语句2202进行查找,以将表格2004的“办公室”列中的数据值“LA”从“LA”改变为“SF”。由于在符号结构2212中已经保持有数据重复信息,如上关于图12的描述,所以只有符号结构2212中的条目2214需要从“LA”更新为“SF”以满足数据库查询语言语句2202。这样,当使用数据重复信息时,数据库查询语言语句的性能大大地提高了。系统体系结构概述在图23的方框图所描述的计算机系统2300上可以实施本发明提高数据库查询语言语句的方法。计算机系统2300包括总线2302、或其它用于传递信息的通信机制,和与总线2302耦合用于处理信息的处理器2304。计算机系统2300也包括主存储器2306,诸如随机访问存储器(RAM)或其它动态存储器件,其与总线2302耦合,用于存储信息和由处理器2304执行的指令。主存储器2306在处理器2304执行指令期间也可以用于存储临时变量或其它中间信息。计算机系统2300进一步包括与总线2302耦合的只读存储器(ROM)2308或其它静态存储器件,用于存储静态信息和处理器2304的指令。提供有存储器件2310、诸如磁盘或光盘,并且其与总线2302耦合用于存储信息和指令。计算机系统2300也可以通过总线2302与显示器2312、诸如阴极射线管(CRT)耦合,用于向计算机用户显示信息。输入设备2314、包括字母数字和其它键,与总线2302耦合,用于向处理器2304传递信息和命令选择。另一种类型的用户输入设备是光标控制2316,诸如鼠标、轨迹球、光标方向键,用于向处理器2304传递方向信息和命令选择,以及用于控制显示器2312上的光标移动。该输入设备典型地具有两个轴向上的自由度,第一轴(例如x)和第二轴(例如y),可以让该设备指定平面中的位置。在一个实施例中,计算机系统2300用来提高数据库查询语言语句的性能。根据一个实施例,通过计算机系统2300响应于处理器2304,执行包含在主存储器2306中的一个或多个指令的一个或多个序列而提供这种用途。这种指令可以从另一个计算机可读介质、诸如存储器件2310读入到主存储器2306中。对包含在主存储器2306中的指令序列的执行使得处理器2304执行此处所描述的处理步骤。在多处理设备中也可以采用一个或多个处理器来执行包含在主存储器2306中的指令序列。在其它实施例中,可以使用硬线电路来代替软件指令、或与其结合使用。于是,本发明的实施例并不局限于硬件电路与软件的任何具体组合。此处所使用的词语“计算机可读介质”指的是在用于向处理器2304提供执行指令的任何介质。这种介质可以是多种形式,包括但并不限于非易失性介质、易失性介质、和传输介质。非易失性介质例如包括光盘或磁盘,诸如存储器件2310。易失性介质包括动态存储器、诸如主存储器2306。传输介质包括同轴电缆、铜线和纤维光学、以及包括总线2302的线。传输介质也可以是声波或光波的形式,诸如在无线电波和红外数据通信中所产生的。普通形式的计算机可读介质例如包括软盘、软磁盘、硬盘、磁带、或任何其它磁介质、CD-ROM、任何其它光介质、穿孔卡、纸带、带有孔图案的任何其它物理介质、RAM、PROM和EPROM、FLASH-EPROM、任何其它存储芯片或磁带、如此后所描述的载波、或计算机可读取的任何其它介质。可以使用各种形式的计算机可读介质携带处理器2304执行的一个或多个指令的一个或多个序列。例如,指令初始可以携带在远程计算机的磁盘上。该远程计算机可以将指令装载到其动态存储器中,并使用调制解调器在电话线上发送指令。位于计算机系统2300中的调制解调器可以接收电话线上的数据,并使用红外发射器将该数据转换为红外信号。与总线2302耦合的红外检测器可以接收红外信号中携带的数据,并将该数据放置在总线2302上。总线2302将该数据传送给主存储器2306,处理器2304从其中检索并执行该指令。由主存储器2306接收到的指令可以在被处理器2304执行之前或之后,可选的存储在存储器件2310中。计算机系统2300也包括与总线2302耦合的通信接口2318。通信接口2318提供与网络链路2320耦合的双向数据通信,该链路与本地网络2322连接。例如,通信接口2318可以是综合业务数字网(ISDN)卡或调制解调器,提供到对应类型电话线的数据通信连接。作为另一个范例,通信接口2318可以是提供到兼容LAN的数据通信连接的局域网(LAN)卡。也可以通过无线链路实施。在任何这种实施方式中,通信接口2318发送和接收电子、电磁或光学信号,其携带表示各种类型的信息的数字数据流。网络链路2320典型地提供通过一个或多个网络到其它设备的数据通信。网络链路2320例如可以提供通过网络2322到主计算机2324、或者到由互联网服务提供商(ISP)2326操作的数据设备的连接。ISP2326最终提供通过全球网包数据通信网络、现在一般称为“互联网”的2328的数据通信业务。本地网络2322和互联网2328都使用携带数字数据流的电子、电磁或光学信号。通过各种网络的信号和网络链路2320上并通过通信接口2318的信号将数字数据携带至计算机系统2300、或从其带走,它们都是范例形式的传输信息的载波。计算机系统2300可以通过网络链路2320和通信接口2318发送和接收数据,包括程序编码。在互联网的范例中,服务器2330可以通过互联网2328、ISP2326、本地网络2322和通信接口2318传送应用程序的请求编码。根据本发明,这样下载的一个应用可以管理、存储和从包含多个数据存储器件的存储系统中检索数据。当接收到编码时,其可以通过处理器2304执行,和/或存储到存储器件2310、或其它非易失性存储器中,用于以后执行。通过这种方式,计算机系统2300可以获得载波形式的应用编码。说明性实施例下面提供本发明实施例的详细实施方式。在该实施例中,采用允许各种数据压缩方式的块数据格式。该数据块格式可以用作现存系统的现存块格式的扩展。该数据块格式定义了如何将行片段存储在数据块中。块的首部包括用于指示在特定块中是否使用了任何或全部下面特征的字段块级压缩块级列的重新排序行内游程长度的NULL压缩列的重新排序如果设置了列的重新排序的指示符,那么该块使用块级列的重新排序。如果N列分别具有一组行片段,那么对列编号进行块级列的置换就可以对列重新排序。如果块使用了列的重新排序,那么可以在块的首部之后直接存储两个数组。第一数组存储前导列的长度(fixed_width_column_count)。在本实施例中,块中首先满足fixed_width_column_count>=0的列是该块中固定长度的列。在该实施例中,值fixed_width_column_count可以为零。第二数组存储块的列编号置换(ub1Perms[block-level_column_count])。列的重新排序至少有两个优点。第一,通过将适当的列分组在一起,列的重新排序可以产生更高的压缩。第二,通过将固定长度的列移动到可变长度的列前面,列的重新排序提高了对第N列的访问。如果第一组列在块中具有固定的长度,可以将这些长度一次存储在该块中,而不是存储在每一行中。这些长度可以存储在长度数组中。这些数组可以被看作用于空间计算的块首部的一部分。对列进行重新排序的另一个优点就是,如果列在块的所有行中都是NULL,那么可以有效地将其从所有行片段中“压缩出”,因为NULL列并没有任何数据,并且将其长度存储在该长度数组中。将块级固定列的长度从行片段移动到块级数组可以提供相对便宜的压缩,如果列值较短这样就特别有效,这种情况出现在数据是较高的数字的时候。在一个实施例中,对列进行重新排序后的行应该具有相等的列数,并且对应的列应该具有相等的长度。然而,并不是在所有的实施例中,给定块中的所有行片段都必须具有这些属性,因为在这种情况下,破坏这种要求的插入(Insert)和更新(Update)操作可能变得效率不高。因此在可选实施例中,在并不满足重新排序要求的、对列重新排序后的块中允许有行片段。对于对列重新排序后的块,不对这些行片段的列进行重新排序。如果块被重新排序并且压缩,那么这些行片段要进行压缩。因此,允许有只是部分满足固定长度要求的行。列重新排序后的块中的每一行与指定的字段关联,该字段标识该行中有多少前导列的长度符合块级列长度数组参数。在一个实施例中,并不对转发的行片段和删除的行片段的列进行重新排序。也不对明确排除在列的重新排序之外的行片段的列进行重新排序。新数据层报头的可变化部分包括存储在perms数组中的置换和存储在lens数组中的固定宽度列的长度。对于N列的块中具有M个固定长度的列的行,变化部分占sizeof(ub1)×N+sizeof(ub2)×M个字节。假定sizeof(ub1)×N+sizeof(ub2)×M-3×N所占的空间(参考VARSPACE(M,N))不超过3×N。通过不存储行片段内固定宽度列的长度,每行至少可以节省M字节。对于具有K列被重新排序过的块中的行,至少可以节省(M-1)×K字节(因为在ub1中有每行片段的固定长度列的计数,所以是M-1)。在实施例中,平衡点是在K=5的时候,对于K>5就会开始有节省。在一个实施例中,应该配置该过程,使得列重新排序后的数据不比未压缩的数据占用更多的空间。如上所述,第一数组lens(ub2lens[fixed_width_column_count])包含块的前n列的固定列长度(其中n=fixed_width_column_count)。不是在数组的每一元素中存储列的长度,可以使用非交换求和对周围可能的NULL值进行处理,存储列长度的前缀和(prefixsum),如下lens←SIZEOF(column),lens[k]←lens[k-1]SIZEOF(column[k]),k>0其中如果该列是NULL,SIZEOF(col)≡0x8000,并且求和操作只占用右边的操作数0x8000个比特,即不是可交换的。例如,考虑10个固定宽度列长度的序列,如下5,5,12,7,NULL,NULL,4,NULL,4,6,该数组会包含下列值5,10,22,29,32797,32797,33,32801,37,43。从该数组中提取第N列的长度的操作如下。首先,如果k<fixed_width_column_count,测试lens[k]&0x8000,以检测列k是否是NULL。如果不是NULL,那么其长度为len←lens[k]-(1ens[k-1]&0x7FFF),k>0或len←lens,k=0如果块中有多个固定宽度的列,那么该数组可以占用大量的空间。对于使用固定长度列的重新排序所可能存在的优点就是,例如通过将NULL列全局地转动到末尾并接着进行截取NULL尾值,可以压缩出长序列的NULL列。通常,块中固定长度的列越多,多个列具有相同列长度的可能性就越高。块格式如果在块的首部设置行压缩指示符,那么其可以指示出块中的全部或部分行被压缩。仅仅是为了下面的解释,假定给定块的列已经被重新排序过,该块的第0至第(fixed_width_column_count-1)列都是固定长度,并且其余列的长度可变。进一步假定第0至第(fixed_width_column_count-1)列已经将它们的长度删除并将其存储在块级数组lens中。其余的列将它们的长度存储在该列自己中。在实施例中,对该块的行片段格式进行如下定义#defineSHORT_INDEX200#defineSHORT_LENGTH250#defineLONG_INDEX251#defineLONG_LENGTHSHORT_LENGTHSHORT_INDEX的值是指向符号表中的索引。对于值L∈[SHORT_INDEX,SHORT_LENGTH),len←(L-KDRCSSHORTINDEX)就是现场存储的列(即未压缩的列)的长度。LONG_INDEX的值指示后2个字节包含指向符号表中的索引值。值LONG_LENGTH指示随后是一个未压缩的列(首先是长度字节)。行首部中的列计数字段包含出现在行中列长度前几个字节的计数。在一个实施例中,符号表是table,其具有数据层的行。该符号表中的行并不具有标志字节或锁定字节。对于标志字节,例如可以通过获取数据块锁定来对符号表条目进行锁定。在一个实施例中,如果多符号表的操作非常不频繁,可能会导致符号表操作的同时丢失。符号表行的标准或锁定字节可以包含参考字节,将其存储为ub2。在实施例中,除了下面用来将第一长度字节值进行范围划分的常数之外,符号表行类似于行片段格式;#defineSYMTAB_SHORT_INDEX200#defineSYMTAB_SHORT_LENGTH250#defineSYMTAB_LONG_INDEX251#defineSYMTAB_LONG_LENGTHSYMTAB_SHORT_LENGTH对这些第一长度字节的解释与如上对块的行片段的相同。另外,在符号表中可以有多列条目。在实施例中,前缀、固定长度列的压缩不同于其它列的压缩。出现区别是因为从这些列中删除了长度。可以进行下面的操作,通过使用停止字节Bi对前缀、固定长度的列进行压缩。如果B0<SHORT_INDEX,行片段数据的第一字节B0是到符号表中的索引。否则(B0-SHORT_INDEX)就是随后的现场存储(即未压缩)的固定长度列的数目。下一字节B1或者直接在B0之后,或者相应地直接跟随在前的(B0-SHORT_INDEX)列的数据。在跟随Bk的列还是固定长度时,该定义继续循环。压缩器在实施例中,至少可以用两个不同的压缩方法。在线压缩会递增的形成被压缩的块。离线压缩首先将足够数目的行缓冲到缓冲器中,并然后尽实际可能的将足够多的行放入压缩区。在线压缩的魅力是因为其不需要保持另外的缓冲器,或执行另外的存储拷贝(memcopy)操作。然而在某些情况下,在线压缩的压缩质量可能会远不如离线压缩。例如,递增地形成块可能会在处理之前不对列进行完整的预分析,这可能会对有效地执行块级列的重新排序产生负面的影响。通过在大部分块已经形成之后,执行块重组(再压缩),以试图改善这些限制,这样的开销可能非常高。下面的描述是关于离线压缩,其中处理大批组的行,以形成一个或多个完整的块。每一数据列可以描述为指向缓冲器中、例如指向源表格的数据块中其数据的指针。使用下面的词语描述本发明的压缩器-SingleEntry(SE)表示具有指向数据、数据长度和几个参考计数的指针的列。-RowModel(RM)表示作为指向SE的指针和SE(列计数)的计数的数组的行。-RowSetModel(RSM)表示作为指向RM的指针和行计数的数组的一组行。RSM构造对于离线压缩,由于压缩器模块对行进行缓冲,所以其建立一组行的RSM。在哈希表格中查找每一行列,并且如果没有,为该列分配新的SE,否则使用指向现存SE的指针。可以使用动态存储管理器来减少碎片和存储分配的开销。在一个实施例中,该存储管理器是用于只持续在单个块压缩期间的每块临时地分配,和持续在段压缩期间的每段存储。RSM表示作为SE指针的矩阵的一组行,其中相等的行指向相同的SE。每一SE将会成为单个列的符号表条目。一旦建立了RSM之后,可以根据SE参考计数产生由单个列条目组成的该符号表。对于某些数据集,这可以提供有效的压缩,因为可以通过指向符号表中少量字节的索引对重复的SE编码。为了得到更高的压缩,可以使用指向符号表中的索引来代替列序列,并且创建多列符号表条目。MultiEntry(ME)表示多列符号表条目的候选值。使用其第一列的(row,column)对其进行描述,列计数更多的字段。在本实施例中,压缩操作涉及到为给定的RSM标识一组有用的ME的操作。可以采取几个步骤来执行块级列的重新排序的计算。在第一步(步骤A),可以使用经验规则计算块级列的重新排序通过(列基数、列长度基数)对列进行排序。RSM每使用该规则一次,压缩器就确定列的重新排序一次。在一个实施例中,考虑下面的2列c1和c2,通过该排序规则使得c1≡c2,或者可认为c1比c2更可接受一些111211121112111211121122一旦完成步骤(A),可以进行字典建立(步骤(C))。该步骤包括标识RSM的{ME}。可以认为RSM是字母表上由指向SE的指针组成的文本。对于在8k块的实施例中,该文本的长度大约在5000-10000个符号以内(分别是200-400行25列),并且每块的离散符号的数目大约在700-900个以内。标识{ME}的问题因此可以认为是整数字母表上的替代压缩问题,该字母表的大小大约是常规1字节字母表(256×32[700,900])的3倍。在实施例中,压缩器在步骤A与步骤C之间另外执行步骤B,并且此处将其称为“前缀检测”步骤。该步骤捕获被压缩的数据集的离散属性,例如包括一组行的数据集的属性。该数据集的离线属性就是,其是一组行,其中列在步骤A中按照列基数对列进行排序过。可以为行组{ri}i=1n建立N-ary数字压缩查找树。该查找树刚好具有N行的N个叶、根节点和几个分支结点。可以通过下面的树构建程序描述该树·空树只包含根节点。·在向树添加第一行r1之后,该树包含根节点、一个叶节点和一个连接根与叶的边(edge)。该边用r1中的所有符号标记。·当向该树添加行r2时,添加一个叶节点。如果r2中的第一符号与r1中的第一符号相同,那么删除旧的边,向该树添加新的分支节点,连接根与新的分支、并连接新的分支节点与两个叶。用行r1和r2的最长的共同前缀来标记从根到新分支的边。标记将新分支节点对应地与具有行r1和r2后缀的叶连接起来的边。如果r2中的第一符号与r1中的第一符号不相同,那么简单地添加从根到新叶的新边,其用来自r2的所有符号标记。对于RSM中的所有行循环地进行树构建。作为范例,假定向该树添加4行ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOIQRSTUVWXYZ1BCDEFGHUKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTAAAAAA该树从根节点分出两个边,一个是用r3中的所有符号标记的、连接根与r3的叶节点,另一个边连接根与分支节点,标记该边的符号是ABCDEFGHIJKLMNO对从该分支节点出来的两个边进行标记的符号相应的是1QRSTUVWXYZ和PQRST。第一边连接该分支与行r2的叶,第二边连接该分支与另一个分支。最终,另一分支具有将其与r1和r4的叶连接起来的两个边,分别标记为UVWXYZ和AAAAAA。图24所示的范例描述了该树。该树具有某些属性·每一分支节点至少具有2个引出边。·该树至多具有2×N个节点和2×N个边。·链接从根到叶的边标记得到对应叶的行符号。·如果两行共用相同的前缀,那么从根到它们的叶的路径共用相同的边,其累加长度等于最大的共用前缀长度。·分支节点与至少两行共用的前缀之间存在一一对应关系。如果使用出自该节点的子树中叶节点的数目和从根到该节点的累加边的长度标记该树的每一分支节点,那么对于每一分支节点,我们可以立即说出有多少行共用终止于该节点的前缀。一旦构建该树,就可以在单树深度优先遍历中进行标记,行数为N时其具有的复杂度为O(N)。一旦构建并标记了该树之后,继续进行前缀检测。根据简单的递归程序进行前缀检测。考虑下面20行的范例ABCDEFGHUKLMNOPacABCDEFGHUKLMNOPadABCDEFGHIJKLMNOPaeABCDEFGHIJKLMNOPafABCDEFGHIJKLMNOPagABCDEFGHIJKLMNOPahABCDEFGHIJKLMNOPaiABCDEFGHIJKLMNOPajABCDEFGHIJKLMNOPakABCDEFGHIJKLMNOPalABCDEFGHIJKLMNOPbmABCDEFGHIJKLMNOPbnABCDEFGHIJKLMNOPboABCDEFGHIJKLMNOPbpABCDEFGHIJKLMNOPbqABCDEFGHIJKLMNOPbrABCDEFGHIJKLMNOPbsABCDEFGHIJKLMNOPbtABCDEFGHIJKLMNOPbuABCDEFGHIJKLMNOPbv该树的根节点n0具有的出自其的一个边(n0,n1),标记为ABCDEFGHIJKLMNOP节点n1具有出自其的两个边(n1,n2)和(n1,n3),边(n1,n2)标记为a并且边(n1,n3)标记为b节点n2和n3标记为计数为10的叶节点,并且它们到根的距离为17。节点n1标记为计数为20的叶节点,并且它们到根的距离为16。对于该范例,在构建{ME}中可以提供下面的选择选择1{ME}=(该符号表中没有ME)选择2{ME}={{ABCDEFGHIJKLMNOP}}(一个ME)选择3{ME}={{ABCDEFGHIJKLMNOPa},{ABCDEFGHIJKLMNOPb}}(两个ME)选择4{ME}={{ABCDEFGHIJKLMNOP},{#0a},{#0b}}(三个ME)。执行另一个树的遍历,以帮助选择{ME}。该算法具有共同的步骤。在每一步骤时,一个分支节点是当前节点。该共同步骤由对下面选项进行的选择组成选项1对于当前节点是适当的前缀时,不创建另外的ME。选项2对于当前节点是适当的前缀时,创建另外的ME;将终止于当前节点的前缀复制到这些ME中。选项3对于当前节点是适当的前缀时,创建另外的ME;将终止于当前节点的前缀分解到单独的ME中,并制造另一个指向其的指针。注意到对于上面20行的范例选择1当前节点是n0时,由选项1给出;选择2当前节点是n0时,由选项2给出,并且当前节点是n1时,由选项1给出;选择3当前节点是n0时,由选项3给出,并且当前节点是n1时,由选项2给出;选择4当前节点是n0时,由选项3给出,并且当前节点是n1时,由选项3给出。因此,前缀检测算法遍历该树,在当前分支节点从上面提到的3个选项进行选择,通过考虑·当前节点的标记;·在当前节点子树中的所有相邻节点中的标记;·创建新符号表条目的非零成本并且然后处理到该子树。当该子树遍历到达叶节点时,如果对应行的任何前缀压缩了或者没压缩,其都“知道”,并且如果其压缩了,其“知道”是使用哪一个MS压缩的。这样,在一个方法中,前置检测从给定块的一组最理想的{ME}中找到所有的前缀ME,或者如果该最理想的组是空或不包括任何前缀ME,其发现没有ME。在实施例中,该压缩器通过首先装载标准的数据块和其并行的RSM工作。在此之后,压缩器通过试图创建新的压缩块来压缩RSM。如果来自该标准块的行不能装入到新压缩块(即没有压缩),那么该压缩器将该压缩块写入,并继续对下一组行进行处理。否则,通过比较标准块中的自由空间与压缩块中的自由空间,对压缩增益进行估计。如果没有压缩增益或者压缩压缩最小,那么压缩器将该压缩块写入,并继续对下一组行进行处理。否则,如果压缩增益较大,那么估计通过插入可以装入到块中的行数,并切换到缓冲模式。在缓冲模式中,构建RSM而不装载任何数据到块中。一旦所估计数目的行已经缓冲进入RSM中后,试图再次压缩RSM。存在3种可能的结果·RSM不能装入单个压缩块中。·RSM装入了单个压缩块中,并且自由空间的浪费最小。·RSM装入了单个压缩块中,并且还存在自由空间可以装入更多的行。在第一种情况下,通过重复地将[known2fit,known2notfit]间隔二等分,其具有起始条件known2fit=未压缩块中的行数,known2notfit=我们估计但是不能装入的行数,开始减少RSM中压缩器试图装入到单个块中的行数。在第二种情况下,将压缩块写入,并继续对下一组行进行处理。在第三种情况下,重新估计行数并继续缓冲RSM。每一单独的块压缩都包括执行步骤A、步骤B、替换RSM中检测的前缀,并将得到的RSM馈送到步骤C。解压缩器本发明能够对压缩数据进行非常快速、低系统开销的解压缩。在实施例中,可以直接从块中得到列值/长度。因此,解压缩过程也就是通过解释块首部比特、固定列和列置换数组(如果存在的话)、以及第一长度字节和该行引用的符号表条目,查找这些值。可以返回这些引用的数据值,而不需要执行任何代价较高的解压缩和重建算法。在前面的说明中,已经参照其具体的实施例描述了本发明。但是显然,不脱离本发明广阔的精神和范围可以对其做出各种修改和变化。例如,参照特定的排序处理过程描述上述处理流程。然而,可以改变所描述的许多处理过程的顺序,而不影响本发明操作的范围。说明书和附图相应的看作是说明性的,而不是限制性的。权利要求1.一种用于以压缩格式存储数据的方法,包括接收将数据存储到盘上的一个或多个数据库块上的请求;分析该数据,以确定冗余数据项目的存在;创建一个符号结构,以存储该冗余数据项目;格式化对应于该数据的盘上数据结构;和使该盘上数据结构与对存储在该符号结构中的冗余数据项目的引用相关联,其中该盘上数据结构不显式包含该冗余数据项目的拷贝。2.根据权利要求1的方法,其中使用链接或指针来引用存储在该符号结构中的冗余数据项目。3.根据权利要求1的方法,其中该数据包括具有一个或多个行的关系数据。4.根据权利要求3的方法,其中在线处理每一行。5.根据权利要求3的方法,其中离线处理一组行。6.根据权利要求1的方法,其中重组该数据,以增加冗余数据项目的可能性。7.根据权利要求6的方法,其中对重组考虑该数据的基数。8.根据权利要求1的方法,其中该符号结构包括递归地引用该符号结构中的另一条目的条目。9.根据权利要求8的方法,其中该条目引用该符号结构中的多个其它条目。10.根据权利要求8的方法,其中该条目包括所存储的冗余数据项目和递归地引用该符号结构中的另一条目的条目。11.根据权利要求8的方法,包括与递归地引用该符号结构中另一条目的条目相关联的第二盘上数据结构。12.根据权利要求8的方法,进一步包括第二盘上数据结构,其中该盘上数据结构内的多个字段共同地与一个引用相关联,该引用具有递归地引用该符号结构中另一条目的条目。13.根据权利要求12的方法,其中数据列被重新排序。14.根据权利要求13的方法,其中数据列被重新排序,以增加该盘上数据结构内的多个字段的序列重复的可能性。15.根据权利要求12的方法,其中在数据库块的级别进行列的重新排序。16.根据权利要求13的方法,其中NULL尾值不包括在该盘上数据结构中。17.根据权利要求1的方法,其中该数据块包括指示是否应用了压缩的元数据。18.根据权利要求17的方法,其中该元数据包括单个比特。19.根据权利要求1的方法,其中该数据块包括指示列是否被重新排序的元数据。20.一种用于检索以压缩格式存储的数据的方法,包括接收从盘上的一个或多个数据库块检索数据的请求;分析该请求,以确定要访问的一个或多个数据块;分析该一个或多个数据块,以确定是否应用了压缩;检索对应于该数据的盘上数据结构;和对于被该盘上数据结构引用的冗余数据项目,从一个符号结构中检索该冗余数据项目。21.根据权利要求20的方法,其中使用链接或指针来引用存储在该符号结构中的冗余数据项目。22.根据权利要求20的方法,其中该数据包括具有一个或多个行的关系数据。23.根据权利要求20的方法,其中该符号结构包括递归地引用该符号结构中的另一条目的条目。24.根据权利要求23的方法,其中该条目引用该符号结构中的多个其它条目。25.根据权利要求23的方法,其中该条目包括所存储的冗余数据项目和递归地引用该符号结构中另一条目的条目。26.根据权利要求23的方法,包括检索与递归地引用该符号结构中另一条目的条目相关联的第二盘上数据结构。27.根据权利要求23的方法,进一步包括检索第二盘上数据结构,其中该盘上数据结构中的多个字段共同地与一个引用相关联,该引用具有递归地引用该符号结构中另一条目的条目。28.根据权利要求20的方法,其中重新构建先前被删除的NULL尾值。29.一种用于存储数据的方法,包括接收存储数据的请求,该数据包括多个列;重新排序该多个列,以增加NULL尾值的可能性;和创建该数据的存储版本,其中该数据的存储版本不包括该NULL尾值。30.根据权利要求29的方法,其中将该数据的存储版本写到盘上。31.根据权利要求29的方法,进一步包括创建元数据的操作,该元数据指示该NULL尾值不包括在该存储版本中。32.一种用于在数据库块上存储数据的结构,包括用于在盘上存储冗余数据项目的符号结构;和在盘上的盘上数据结构,其包括对该符号结构中该冗余数据项目的引用。33.根据权利要求32的结构,其中使用链接或指针来引用存储在该符号结构中的冗余数据项目。34.根据权利要求32的结构,其中该数据包括具有一个或多个行的关系数据。35.根据权利要求32的结构,其中该符号结构包括递归地引用该符号结构中的另一条目的条目。36.根据权利要求35的结构,其中该条目引用该符号结构中的多个其它条目。37.根据权利要求35的结构,其中该条目包括所存储的冗余数据项目和递归地引用该符号结构中的另一条目的条目。38.根据权利要求35的结构,包括与递归地引用该符号结构中另一条目的条目相关联的第二盘上数据结构。39.根据权利要求35的结构,进一步包括第二盘上数据结构,其中该盘上数据结构中的多个字段共同地与一个引用相关联,该引用具有递归地引用该符号结构中另一条目的条目。40.根据权利要求32的结构,其中数据列被重新排序。41.根据权利要求40的结构,其中数据列被重新排序,以增加该盘上数据结构内的多个字段的序列重复的可能性。42.根据权利要求32的结构,其中NULL尾值不包括在该盘上数据结构中。43.根据权利要求32的结构,其中该数据块包括指示是否应用了压缩的元数据。44.根据权利要求43的结构,其中该元数据包括单个比特。45.根据权利要求32的结构,其中该数据库块包括指示是否对列重新排序的元数据。46.一种用于提高数据库查询语言语句的性能的方法,该方法包括保持描述数据块中的数据重复的信息;接收针对该数据块中的数据的数据库查询语言语句,该数据库查询语言语句至少包括一个谓词(predicate);和使用该数据重复信息减少在该数据块中的数据上进行谓词评估的次数。47.根据权利要求46的方法,其中保持描述数据块中的数据重复的信息包括标识该数据块中的一个或多个重复数据值;计算该一个或多个重复数据值中的每一个所出现的次数;和存储该一个或多个重复数据值中的每一个,以及该重复数据值在一个符号结构的条目中出现的对应次数。48.根据权利要求47的方法,其中保持描述数据块中的数据重复的信息进一步包括从该数据块中去除该一个或多个重复数据值的至少其中之一的一次或多次出现;和配置该数据块的对应于所删除的出现的部分,以引用该适当的符号结构条目。49.根据权利要求48的方法,其中使用链接或指针来引用该适当的符号结构条目。50.根据权利要求47的方法,其中保持描述数据块中的数据重复的信息进一步包括当添加或删除该重复数据值的出现时,更新该一个或多个重复数据值的其中之一的出现次数。51.根据权利要求50的方法,其中保持描述数据块中的数据重复的信息进一步包括当符号结构条目中该重复数据值的出现次数为零时,删除该符号结构条目。52.根据权利要求46的方法,其中减少在该数据块中的数据上进行谓词评估的次数包括在该数据块中的重复数据值上评估该至少一个谓词至多一次。53.根据权利要求46的方法,其中减少在该数据块中的数据上进行谓词评估的次数包括在数据值上评估该至少一个谓词之前,判定是否先前已经在该数据块中的该数据值的重复上评估了该至少一个谓词;当先前已经在该数据值的重复上评估了该至少一个谓词时,利用先前在该数据值的重复上评估该至少一个谓词的结果;和当先前没有在该数据值的重复上评估该至少一个谓词时,在该数据值上评估该至少一个谓词。54.根据权利要求53的方法,其中判定是否先前已经在该数据值的重复上评估了该至少一个谓词包括验证该数据值是否出现在上下文中,该上下文存储该数据块中先前评估该至少一个谓词所基于的每一数据值,以及对应的该先前谓词评估的结果。55.根据权利要求46的方法,进一步包括使用该数据重复信息减少被该数据库查询语言语句访问的数据量。56.根据权利要求55的方法,其中减少被该数据库查询语言语句访问的数据量包括计算该数据块中对该至少一个谓词评估为真所基于的数据值的总数;设置计数器等于该总数;当访问该数据块中的对该至少一个谓词评估为真所基于的数据值时,减小该计数器;和访问该数据块中的数据值,直至该计数器等于零。57.根据权利要求55的方法,其中减少被该查询访问的数据量包括更新该数据重复信息,而不是访问数据块中的数据值。58.根据权利要求46的方法,其中在该数据块中保持该数据重复信息。59.一种包括计算机可读介质的计算机程序产品,该计算机可读介质在其上存储有指令序列,该指令在被处理器执行时,使得该处理器执行用于以压缩格式存储数据的过程,该过程包括权利要求1-19中任何一项的操作。60.一种包括计算机可读介质的计算机程序产品,该计算机可读介质在其上存储有指令序列,该指令在被处理器执行时,使得该处理器执行用于检索以压缩格式存储的数据的过程,该过程包括权利要求20-28中任何一项的操作。61.一种包括计算机可读介质的计算机程序产品,该计算机可读介质在其上存储有指令序列,该指令在被处理器执行时,使得该处理器执行用于存储数据的过程,该过程包括权利要求29-31中任何一项的操作。62.一种包括计算机可读介质的计算机程序产品,该计算机可读介质在其上存储有指令序列,该指令在被处理器执行时,使得该处理器执行用于提高数据库查询语言语句性能的过程,该过程包括权利要求46-58中任何一项的操作。63.一种用于以压缩格式存储数据的系统,该系统包括用于执行权利要求1-19中任何一项操作的装置。64.一种用于检索以压缩格式存储的数据的系统,该系统包括用于执行权利要求20-28中任何一项操作的装置。65.一种用于存储数据的系统,该系统包括用于执行权利要求29-31中任何一项操作的装置。66.一种用于提高数据库查询语言语句性能的系统,该系统包括用于执行权利要求46-58中任何一项操作的装置。全文摘要公开了一种用于在计算系统中实施存储和检索数据的方法和机制。通过减少或去除数据库块中的重复值,对所存储的数据进行数据压缩。不是将该重复数据值写到该数据存储单元,而是配置该盘上数据,以引用存储在符号表中的每一重复数据值的拷贝。也公开了一种用于提高数据库查询语言语句性能的方法和机制。保持描述数据块内数据重复的信息。在一个实施例中,当接收到针对该数据块中的该数据的数据库查询语言语句时,使用该数据重复信息来减少在该数据块中的数据上进行谓词评估的次数。在另一个实施例中,使用该数据重复信息以减少被数据库查询语言语句访问的数据量。文档编号G06F17/30GK1666196SQ03815269公开日2005年9月7日申请日期2003年5月12日优先权日2002年5月10日发明者德米特里·M·波塔波夫,塞廷·奥兹布藤申请人:甲骨文国际公司