用于基于列的数据编码结构的查询的高效大规模过滤和/或排序的制作方法

xiaoxiao2020-7-22  4

专利名称:用于基于列的数据编码结构的查询的高效大规模过滤和/或排序的制作方法
技术领域
本发明一般涉及与对大量数据的查询有关的高效的基于列的过滤和/或排序。背景作为关于常规数据查询系统的背景,当大量数据被存储在数据库中时,如当服务器计算机收集很长时间段内的大量数据记录或事务时,其他计算机有时候希望访问该数据或该数据的目标子集。在这一情况下,其他计算机可经由一个或多个查询运算符来查询所需数据。在这一方面,历史上,关系型数据库已经出于此目的而演变,并且已经被用于此类大规模数据集合,并且已经开发了指示数据库管理软件代表查询客户机从关系型数据库或一组分布式数据库中检索数据的各种查询语言。传统上,关系型数据库是根据对应于记录的、具有字段的行来组织的。例如,第一行可能包括关于其对应于各列的字段的各种信息(姓名1、年龄1、地址1、性别1等),这些信息定义了该第一行的记录;而第二行可能包括关于第二行的各个字段的各种不同信息 (姓名2、年龄2、地址2、性别2等)。然而,客户机对巨大量的数据的常规查询或对本地查询或本地商业智能检索巨大量的数据受到限制,因为它们无法满足实时或近乎实时的要求。尤其是在客户机希望具有来自服务器的最新数据的本地副本的情况下,在给定有限的网络带宽和有限的客户机高速缓存存储的情况下,从服务器传输这样大规模量的数据对于许多应用迄今仍是不切实际的。作为进一步的背景,由于将不同的行概念化为不同记录对于作为体系结构的一部分的关系型数据库是很方便的,因此由于关系型数据库是如何组织的本质,用于减小数据集大小的技术迄今已聚焦于行。换言之,行信息通过将每一记录的所有字段一起保持在一行上来保存每一记录,并且用于减小聚集数据的大小的传统技术将字段保持在一起来作为编码其自身的一部分。因此,期望提供一种在数据大小减小和查询处理速度方面达到同时增益的解决方案。除了以产生对大量数据的非常高效的查询的方式来应用压缩之外,还期望获得对于大量数据的复杂运算,如过滤和排序运算的进一步洞察,尤其是在客户机应用或用户可能一次仅希望看见或者只能看见一个小的数据窗口(例如,受到实际显示可操作区域(real estate)的限制)的情况下。在这些情况下,在将整个数据集发送到用户或客户机应用之前在后端对整个数据集执行过滤和排序运算可能是耗时的,且因此在实时应用的情况下是低效或不恰当的。例如,当客户机应用请求对于保存在存储中的大量数据显示一窗口时,当前,在逻辑层,客户机应用可通过诸如以下伪SQL查询等查询来请求该窗口 SELECT SKIP<窗口开始>Τ0Ρ<窗口大小X列的列表>FR0M<表> [J0IN<要联接的表的列表>][WHERE〈谓词列表〉]

为了解析这一请求,常规上,存储层首先对数据进行排序和过滤,并最终使用该经排序且过滤的结果来仅返回指定窗口中的行。然而,在该经排序且过滤的结果中的数据的量极大地超过窗口大小的情况下,可以看到为什么该方法从希望尽快地仅看见给定窗口的用户的观点来看是低效的。在这一点上,一个问题是对大量数据进行排序是非常昂贵的运算,从而影响了请求该数据窗口的组件的性能。解决这一问题的一种常规方式是使存储组件确保它首先应用过滤,然后仅对通过该过滤的结果进行排序。这确保只有较少数据需要排序,并且与过滤是有多么选择性的一般成比例地起到帮助,即,过滤将要排序的目标数据集缩减了多少。然而,可以看到,即使是这一计划在有许多行匹配过滤谓词的情况下也无法起到帮助,因为大量的行仍需要被排序,这又返回到了最初的问题。另一种常规解决方案是使用高速缓存机制,使得对所有行进行排序的成本仅在用户请求第一数据窗口时才付出。在第一窗口之后的后续查询因而具有分摊的成本,因为当过滤和排序条件不变时,查询处理器/处理程序能够使用高速缓存的结果来返回数据上的不同窗口。然而,该方法在存储器方面具有相对高的成本,因为必需保存高速缓存结果。尽管高速缓存可基于包括存储器压力、使用模式等的各种原因而被收回或作废,仍存在至少必须付出对通过过滤的所有行进行排序的初始成本的问题。对于时间要求高的查询,这可能是无法接受的。由此,期望有一种用于在数据密集型应用环境中对大量数据的查询的快速且可伸缩算法,尤其是蕴含了对大规模的数据,例如在目标存储中的数十亿行或更多数据的昂贵的过滤和/或排序运算的查询。当今的关系型数据库和对应的查询技术的上述缺点仅旨在提供常规系统的一些问题的概览,并且不旨在是穷尽性的。常规系统的其他问题以及此处所描述的各非限制性实施例的对应的益处可以在审阅以下描述后变得更显而易见。概述此处提供了简化概述以帮助能够对以下更详细的描述和附图中的示例性、非限制性实施例的各方面有基本或大体的理解。然而,本概述并不旨在作为详尽的或穷尽的概观。 相反,本概述的唯一目的是以简化的形式来提出与一些示例性非限制性实施例相关的一些概念,作为以下各实施例的更为详细的描述的序言。描述了基于列的数据编码结构的查询的各实施例,这些实施例实现了对大规模数据存储的高效的查询处理,尤其是对于蕴含了对定义的窗口上的数据的过滤和/或排序运算的复杂查询的处理。在各实施例中,提供了一种通过完全不对任何行进行排序,或者通过仅对与关联于数据上的所请求的窗口的大小的行数相一致或小于该行数的非常少量的行进行排序,来避免涉及对高百分比的行或所有行的昂贵排序的情形的方法。在一个实施例中,这是通过将外部查询请求拆分成两个不同的内部子请求来实现的,其中第一个子请求对于任何指定的WHERE子句和ORDER BY列计算关于行分布的统计量,而第二个子请求基于该统计量来仅选择匹配该窗口的行。这些和其他实施例以及可任选的特征在下面将更详细地描述。附图简述
各非限制性实施例参考附图来进一步描述,附图中

图1是示出根据一实施例的用于处理查询的一般过程的流程图;图2是符合此处的一个或多个实施例的查询处理环境的一般化框图;图3是示出根据此处的一个或多个实施例的用于处理查询的一般化方法的流程图;图4是示出符合此处的一个或多个实施例的用于满足查询请求的端对端处理流程的流程图;图5是可向其应用一个或多个实施例的技术的通常在真实世界数据中找到的数据的某些样本分布的描绘;图6示出了用于处理查询的包括对此处所描述的直方图的使用的代表性流程图;图7是在此处的一个或多个实施例中结合直方图计算来使用的诸如文本和浮点值等真实世界数据的离散化的示例;图8是根据此处所述的实施例的根据一个或多个预设数据“形状”的直方图的表征的图示;图9示出了具有相对少的不同数据值的样本分布,如具有男性或女性值的字段, 其中数据在一个或多个尖峰中表示;图10是示出符合行程长度原理的对具有几个数据尖峰的样本分布的过滤的框图;图11是单个主导值被展示为尖峰、其余值被相对均勻地表示的样本分布的图示;图12示出了处理对蕴含对样本数据分布的过滤和/或排序运算的查询的处理的代表性方式,其中该样本数据分布具有几个主导尖峰,且其余值被相对均勻地表示;图13示出了根据此处所述的一个或多个实施例的轻量数据高速缓存的示例性、 非限制任选实现;图14示出了用于此处描述的任选的数据处理技术的数据单元的概念;图15示出了散列跟踪数据结构的任选实现;图16是示出根据此处所述的实施例的用于计算直方图的示例性、非限制性过程的流程图;图17是示出根据此处所述的实施例的用于获得并使用统计量的示例性、非限制性过程的流程图;图18是示出根据此处所述的实施例的用于确定在处理对给定窗口的查询时应使用标准或基于列的排序技术中的哪一个的示例性、非限制性过程的流程图;图19是示出根据此处所述的实施例的用于在给定窗口内排序的示例性、非限制性过程的流程图;图20是示出根据此处所述的实施例的用于使用轻量数据高速缓存来处理查询的示例性、非限制性过程的流程图;图21是示出根据一个或多个实施例的示例性、非限制性过程的流程图;图22是示出根据一个或多个实施例的示例性、非限制性过程的另一流程图;图23是示出基于列的编码技术以及对已编码数据的查询的存储器内客户机侧处理的一般框图M是示出采用基于列的编码技术的编码装置的示例性、非限制实现的框图;图25示出了对关于查询所接收到的列数据的存储器内客户机侧处理的工作可在多个核之间拆分,以便共享处理跨列组织的大量行的负担;图沈是示出用于向大规模数据应用基于列的编码的示例性、非限制过程的流程图;图27是原始数据的基于列的表示的图示,其中记录被分解成其各自的字段,相同类型的字段然后被串行化来形成向量;图观是例示记录数据的列化的非限制框图;图四是示出字典编码的概念的非限制框图;图30是示出值编码的概念的非限制框图;图31是示出在混合压缩技术的一方面中应用的位打包的概念的非限制框图;图32是示出在混合压缩技术的另一方面中应用的行程长度编码的概念的非限制框图;图33是示出采用基于列的编码技术的编码装置的示例性、非限制实现的框图;图34是示出根据一实现的用于向大规模数据应用基于列的编码的示例性、非限制过程的流程图;图35-36是执行贪婪行程长度编码压缩算法的方式的示例性图示,包括任选地应用阈值节省算法来应用一替代压缩技术;图37是进一步示出贪婪行程长度编码压缩算法的框图;图38是示出混合的行程长度编码和位打包压缩算法的框图;图39是示出基于总计的位节省分析来自适应地提供不同类型的压缩的混合压缩技术的应用的流程图;图40是示出根据本发明的各实施例的基于列的编码的示例执行来减小总体数据大小的框图;图41示出了关于纯和非纯区域之间的转换(以及相反)可应用于基于列的已编码数据的桶化过程;图42示出了根据一实施例的关于列的桶化的非纯等级;图43示出了将查询/扫描运算符高效地划分成对应于与当前查询/扫描相关的列中存在的不同类型的桶的子运算符;图44示出了基于列的编码的能力,其中所得的纯桶表示数据的超过50%的行;图45示出了用于以标准化方式指定对数据的查询的、用于查询语言的示例性、非限制查询构件块;图46示出了对消费客户机设备所请求的对于可经由网络获得的大规模数据的样本查询的代表性处理;图47是示出根据各实施例的用于根据列来编码数据的过程的流程图;图48是示出根据一个或多个实施例的用于位打包整数序列的过程的流程图;图49是示出用于对数据的基于列的表示进行查询的过程的流程图;附图50是表示其中可实现此处所描述的各实施例的示例性、非限制性联网环境的框图;以及
附图51是表示其中可实现此处所描述的各实施例的一个或多个方面的示例性、 非限制性计算系统或操作环境的框图。详细描述概览作为以下内容的路标,首先描述各实施例的概览,然后更详细地讨论示例性的、非限制任选实现来提供补充的上下文和理解。然后,描述关于用于对大量数据打包的基于列的编码技术的一些补充上下文,包括经由混合压缩技术自适应地在行程长度编码的性能益处和位打包的性能益处之间进行折衷的实施例。最后,描述其中可实现或部署各实施例的某些代表性计算环境和设备。如在背景中所讨论的,特别地,由于当前压缩技术的限制、网络上的传输带宽的限制以及本地高速缓冲存储器的限制,常规系统不足以处理在存储器内非常快地从服务器或 “云”中的其他数据存储读取巨大量的数据的问题。该问题在各种具有实时要求的不同数据密集型应用执行许多查询时变得复杂,并且蕴含了对大量数据的过滤和/或排序的查询由于此类运算的成本而提出了一个独特的挑战。在这一点上,如结合此处的各实施例所描述的,通过完全不对任何行进行排序,或者通过仅对与关联于数据窗口的大小的行数相一致或小于该行数的非常少量的行进行排序,避免了涉及对高百分比的行或所有行的昂贵排序的情形。外部查询请求可被拆分成两个不同的内部子请求,其中第一个子请求对于任何指定的WHERE子句和ORDER BY列计算关于行分布的统计量,而第二个子请求基于该统计量来仅选择匹配该窗口的行。在这一点上,出于稍后对数据进行窗口化的目的充分利用了取决于WHERE和 0RDERBY动态获得的统计量。在某些实施例中,为了最小化统计量构建时间,在为了方便直方图构建而被离散化之后,为真实数据或为合成数据值构建统计量。在这一点上,合成(“离散化”)数据被作为一种形式的联接列来对待以便参与ORDER BY运算。另外,符合以下更详细描述的实施例,一旦分析了 ORDER BY运算所蕴含的列的内容,在以O(n)进行第二次扫描之前,不生成最终窗口。此外,在某些情况下,该方法使用预先计算的分层结构数据来模拟某些类型的合成(“离散化”)列。在一个实施例中,一种算法基于查询定义、从统计量中确定的最终窗口的内容、以及并行化程度来选择用于给定数据的合适的离散化方法以及缓存策略。此外,此处提出了一种用于基于WHERE和ORDER BY桶的内容以及从统计量中确定的最终窗口的内容来选择投影方法的算法。并且,提供了一种用于仅使用对一至最多N(例如,三个)预配置桶的插入来并行地构建最终窗口的方法。在其他实施例中,描述了一种用于在投影期间使用的、根据查询指定、所选离散化方法、如直方图所确定的最终窗口中的数据分布、以及应用于数据处理的并行化程度来配置内部缓存,例如缓存大小及其策略的过程。关于并行处理,分段离散化允许对没有0RDERBY (只有WHERE过滤)的查询或对匹配尖峰的窗口并行地以0(1)的时间来填充最终窗口。并且,在各实施例中,应用智能缓存方法来以0(1)丢弃将不出现在最终窗口中的行。另外,各实施例任选地产生加窗的行 (line)上的迭代程序,来用于流化(stream)所有投影的列的目的。作为对非限制过程的介绍,图1示出了用于典型查询的执行流程的概览。在接收到查询指定之后,系统在100处分析该查询。这可涉及在110处根据分析所选择的方法来离散化数据。在120,在数据上计算直方图。在130,使用直方图分析该查询指定所蕴含的数据窗口,作为其结果,数据缓存140准备好通过对加窗缓存150、152、IM和156进行扫描和填充来并行处理。在160合并缓存结果,并相对于要显示的窗口来修剪结果,且如果满足特定条件,则在170对最终窗口执行局部排序,但仅在需要时才执行。然后输出行号(line#) 迭代程序180。具有过滤/联接运算的基于列的查询处理如在概览中所提到的,可向大量数据应用面向列的编码和压缩来压缩且同时组织数据以使得稍后对数据的扫描/搜索/查询运算显著地更高效。因此,在各实施例中,这一般是通过将外部查询请求拆分成两个不同的内部子请求来实现的,其中第一个子请求对于任何指定的WHERE子句和ORDER BY列计算关于行分布的统计量,而第二个子请求基于该统计量来仅选择匹配该窗口的行。在这一点上,此处描述的技术可用于任何查询应用来提高查询结果向最终应用或用户(即已排序和过滤的行上的窗口可有益于的任何应用)的递送速度。更详细而言,一旦查询请求到达存储层,分析该查询请求,且如果查询不包含任何 0RDERBY或WHERE子句,则通过返回SKIP & TOP指定的物理行来直接针对存储解析该查询。 如果行被过滤和/或排序,则第一步是确定是否能构建任何统计量来帮助标识窗口的内容的本质。此时,还可确定是否可在包含真实数据的列上构建这些统计量,或者是否需要在合成(“离散化”)列上构建这些统计量。该离散化步骤例如通过允许标识每一线程将产生最终窗口中的多少行,或者通过在数据尖峰上产生窗口的同时最小化存储器和时间成本, 来帮助例如在已排序列中的不同数据ID(DataID)的数量较大的情况下最小化构建统计量的成本,或者在没有指定0RDERBY时最小化并行加窗期间的存储器分配成本。该离散化函数一般可被视为已排序列和物理段的函数fn(已排序列,物理段)可使用的某些类型的离散化包括对同一组中的相邻的已排序值进行聚类,按照其中经过滤的数据传递WHERE子句而没有设置0RDERBY的段来离散化,以及通过将尖峰拆分成不同(按段)的组来离散化。一旦选择了一离散化函数(如果有的话),则然后执行内部查询,该内部查询的一般形式为SELECT fn (已排序列,物理段),COUNT ()FROM... WHERE用户指定的谓词该查询返回描述每一值在已排序列上的出现次数,或者如果插入离散化函数的话,描述每一离散化值的出现次数。在这些结果上,可以构建直方图,例如,χ轴包含已排序的组ID(GroupID),且y轴包含先前的组的出现的移动和(running sum)。术语“和”此处有时被缩写为Σ。注意,对于组ID的排序,并非需要对所有现有的行进行排序,甚至不需要对所有不同的数据ID进行排序,因为多个数据ID可通过离散化为相同的组ID而匹配。并且,通过考虑用于存储数据的编码方法,和/或使用预先计算的有序存储(“分层结构”),可确定某一组的位置而不用比较值本身。
9
此处,已经获取了告知每一组在最终虚拟行集中的位置的有价值的统计量,例如直方图数据。任选地,该信息可被高速缓存来用于以后的使用。接着,可将指定的窗口位置与直方图中的数据进行比较,并且可确定已排序的列上的哪些值将存在于该可见窗口中。一旦理解了这一点,生成第二内部查询,该第二内部查询一般形式为SELECT行号SKIP经调整的跳过TOP经调整的顶部FROM...WHERE用户指定的条件AND已排序的列中的值=从直方图确定的值0RDERBY用户指定的已排序的列USING 直方图在内部,可在多个线程上并行执行的该查询使用跟踪最终窗口的数据高速缓存数据结构。该数据高速缓存基于查询指定、所传递的直方图、窗口的位置、所使用的离散化的类型、以及应用于处理的并行化程度来确定其配置。填充最终窗口的请求因此可在可能多个处理器上并行执行,每一处理器扫描不同的段(所涉及的列的部分)并部分地完成最终结果集。在这一点上,可取决于上述数据高速缓存配置来使用各种缓存类型。对这些缓存的插入是0(1),它们之间的不同在于其策略。完成插入的方式以及选择某一缓存还是另一缓存的决策基于缓存配置以及关于所扫描的当前桶(桶是当前在所涉及的WHERE和0RDERBY列中扫描的片段)内的内容的纯度/非纯度的元数据。作为一示例,可分析该关于0RDERBY列上的纯度的元数据,并且如果进行了 0RDERBY的值对于桶的整个长度不改变,则可对整个桶做出什么是其中将记录合格行号的正确缓存的确定。或者,如果该元数据指示WHERE条件对于整个桶的长度不改变,则可用相同的方式来对待该桶中的所有行(line)(或者有资格或者没有资格被添加到桶)。某些类型的缓存用作仅仅插入客户机所请求的任何内容的“普通”缓存,而其他一些缓存则丢弃在给定阈值之后插入的尝试,另外一些缓存则以循环/环形缓存的方式来盖写现有记录。这些缓存所使用的大小和策略是在配置数据高速缓存时选择的,并且使得最终窗口能以O(n)的扫描时间被填充,同时充分利用所有的处理器,即,使用并行执行。在该查询的结束,可存在一个或多个数据高速缓存,如果有多于一个段和多于一个处理器可用则可存在更多,且数据高速缓存包含了转变为最终窗口的所有行号,这可能比确切数量要多一点。然后,应用修剪,即,通过使用直方图以0(1)来完成对额外行号的消除。在许多情况下,保持行号的剩余记录可能不需要额外的排序,因为它们或者是以自然次序的(由于扫描各段时的固有次序),或者可在流输出(Stream out)结果时在进行中进行多重合并(multi-merge)。然而存在仍然需要对经修剪的结果进行排序的某些情况,例如对于通过聚类进行的离散化,或者在中间缓存中分配多个值的情况下,但是这一排序成本即使是在最昂贵的情况下也总是小于对整个表进行排序的成本,因为该排序是有限的并且与可见窗口的大小相关。对于典型的加窗情形,可见窗口的大小将比表中可存在的行数小许多数量级。所产生的加窗信息然后使用返回合格行(行号)的枚举器来展示给外部层,该枚举器被用作产生最终行集时的主驱动器。由此,在各实施例中,可处理用户界面组件或其他界面所生成的查询,以便请求特定数据窗口,对窗口应用过滤,并对其进行排序。在这一点上,在一个非限制实现中,为了提高性能,添加加窗支持作为数据和响应查询的请求应用之间的层,如SELECT[SKIP〈整数〉][TOP〈整数〉][DISTINCT]〈列的列表〉FR0M< 表 >[NATURAL_J0IN< 表 >][NATURAL J0IN< 表 >· · ·]WHERE〈过滤条件〉[ORDER BY< 列 > [ASC | DESC] [,<$ 行号 > [ASC]]]在一典型的情形中,数据消费系统或应用使用到查询处理程序和处理器的接口, 该查询处理程序和处理器代表数据消费者对数据进行高效的探查、过滤和排序,并返回满足该查询的数据窗口。尽管可支持异步查询运算,但期望实际查询能相对快速地完成。例如,在一示例情形中,用户或应用可能面对具有数十亿行的表,并且希望对该表进行查询。例如,用户可应用过滤,并且还可按一列来进行排序。采用以下更详细描述的各实施例,用户可以在几秒内检索满足该查询的适当的数据窗口。一旦检索出该窗口,用户可经由暗示附加查询的UI组件来向下滚动,此时仅在半秒内就返回数万行的后续窗口。关于某种命名法,任选地,可使用被优化来保持聚集结果的数据高速缓存数据结构。作为一简化示例,“方”数据高速缓存可被组织为在一侧具有销售人员ID且在另一侧具有产品ID作为坐标的二维数组,并且在每一单元内保存聚集的值(例如,销售人员对产品所做出的销售总额,其中销售人员和产品由该单元的坐标来标识)。在该示例中,没有与该数据高速缓存内的聚集值相关联的固有次序。如此处所使用的,查询核指的是被优化来响应涉及聚集和过滤的公式引擎请求的分量,其从逻辑观点来看等价于以下SQL查询SELECT<列 >,< 聚集>FR0M<表>WHERE<谓词>GR0UPBY<列 >。查询核被设计成返回数据高速缓存,因为这是较高层能在其上对各种核心场景高效操作的最优结构。如此处所使用的,行集(rowset)指的是包含可以用到查询处理组件的接口来看见的项的一组数据、多个行、多个列。例如,行集可包括被表示为按照销售人员排序的、包含 “销售人员”、“产品”和“收取费用”列的行的所有销售的列表。行集可由服务器来流化,并且其行具有固有次序。查询指定数据结构描述了查询,并且可任选地用作服务器和存储之间的接口。尽管不是文本格式,但查询指定数据结构可在逻辑上被认为等价于服务器发送到存储引擎的查询。如以下更详细描述的,行程长度编码(RLE)是通过表述X值在序列中连续出现N 次来压缩数据的方法。在以下关于用于大量数据的编码技术的补充上下文的节中描述的打包算法的处理期间RLE压缩是首选的。RLE压缩也在查询核为对数据进行快速聚集和快速过滤而执行的扫描期间被利用,该扫描也在以下对补充上下文更详细描述。在处理期间,在面向列的存储中最大化RLE序列,该RLE序列在最大化在某一列上具有相同值的相邻行的序列时被转换。一旦诸如但不限于SQL查询等查询被传递给查询引擎,该引擎就解析该查询,将这些查询绑定到内部查询指定,将查询指定传递给查询处理程序,查询处理程序内部地执行处理来返回包含已排序和已过滤的数据的指定窗口的已排序行集。对于查询引擎和查询处理程序之间的通信,可使用标准客户机-请求接口机制, 例如查询客户机请求和响应。所传递的请求包括描述应返回什么数据的查询指定。响应因而包含行集而非数据高速缓存,因为数据高速缓存具有固有次序。图2是各组件和示例性接口的非限制框图概览。在消费侧,接口组件220处理发出查询202和接收作为结果的行集204。中间层查询引擎210可以通过定义查询指定212 并将其一直传递到查询处理程序220的客户机请求处理程序222来准备查询202。客户机请求组件确定查询指定212是蕴含将查询指定2M转发到快速无排序访问算法226,还是蕴含将查询指定242转发到基于列的排序算法M0。在任一情况下,行集214被返回给查询引擎210以便转发到接口组件200。如上所述,面向列的存储、统计量和其他核心服务组件 230处理所请求的数据上的直方图等的生成。基于列的排序240就查询指定238而言与基于列的扫描234协作,并且可任选地在交换方面使用轻量数据高速缓存236。其他高速缓存数据结构232也可用于存储临时结果以供稍后重用。枚举器228向使用了快速无排序访问 226的地方通知来自核心服务组件230的结果。在查询处理组件内部,若干选项涉及范围从提供以0RDERBY为目标的完全不同的查询引擎到修改现有的查询核以及添加对查询核内部的排序的直接支持,或混合解决方案。在这一点上,当查询以查询指定的形式到达查询处理组件时,检查该查询并对其决定执行路径。注意,对于不蕴含排序次序或过滤的简单查询,可直接对存储使用直接的 ISAM类型的访问,而对于较复杂的查询,选择关注数据分布并使用查询核或面向桶的排序算法的更复杂的执行计划。高速缓存可用于存储可在随后用户在UI组件内滚动时被重用的昂贵的中间结^ ο为了满足在几秒的时间范围内返回数十亿行上的已排序结果的要求,简单的对所有内容蛮力排序方法在所花费的时间和存储器使用方面的代价太高。在各实施例中,使用了一种模块化方法,其中某些模块被重复使用,其他模块则在某些情况下被跳过。整个执行流程的一般算法,包括执行了什么模块的完整的端对端概览可在以下详细描述中获得并讨论。所涉及的模块的高级概览首先在图3中示出。如图所示,最初,在300分析查询指定。然后,在310,在310计算直方图来作为第一步。基于该直方图,在320分析查询所蕴含的局部窗口分布,并且或者选择标准选择330或者选择基于列的排序340来进行处理。在任一情况下,在350,将结果返回给请求应用。首先,从首先是最简单的特定情况,然后逐渐查看较复杂且一般的情况,来呈现各种情况/情形。在各实施例中,以模块化方式呈现统一的、一般的、端对端算法。任选地,可使用高速缓存来存储某些临时结果以便重复使用。在这一点上,当接收到查询时,定义被分析的查询指定。一旦客户机查询到达查询处理组件,分析查询指定来找出是涉及不涉及任何排序和过滤的简单查询,还是该查询是需要大量处理的查询。对于非过滤且非排序查询,例如索引的顺序访问方法(ISAM),如果没有过滤和排
12序,则可通过使用直接的ISAM型的访问类型来履行该请求而没有开销。这意味着(1)获得所涉及的列上的正确枚举器,(2)在正确的位置进行GotoO (例如,执行SKIP),以及(3)在该数据上构建行集,例如对TOP数量的行执行Next (),解码该值并填充行集。在这一点上, 在一个实施例中,解码在查询处理组件级发生,而非返回具有数据ID的行,因为从服务器到查询处理程序的往返以转换数据ID是不必要的。对于过滤但未排序的查询,这是不带排序的更一般的“过滤且排序查询”的简化情况,执行中的差别在于专用排序运算是不必要的,并且可以使用涉及数据过滤步骤但不涉及排序步骤且在过滤后返回窗口的一般情况。在这一点上,在一个实施例中,使用例如能够处理多个并行作业的查询核来充分利用现有的面向桶的过滤逻辑,并获得包含形式为(行号,连续行号)的行的多个“轻量” 数据高速缓存,对这些多个轻量数据高速缓存执行常见的“合并多个轻量数据高速缓存” 算法来寻找真正的(SKIP,TOP)窗口。注意,某些段作业可在一旦发现已经检索到第一个 SKIP+T0P窗口时被较早地停止。此处也称为“C行号”(cline#)的连续行号是在列存储内物理上相邻且匹配过滤谓词的行的计数。由此,(行号,c行号)格式描述了匹配谓词且物理上以连续形式存储的数据组块。这些组块可以是数据基于列来压缩且可在对其执行排序运算的列上找到自然RLE序列的事实的副产品。但还要注意,桶的RLE长度不同于c行号, 因为c行号处理“已过滤的”组块。因此,在这多个拆分窗口上,可以按照与简单ISAM情况相同的方式来构件行集。 图4是该过程的框图概览。外部查询指定412由服务器400的查询处理程序410来处理, 其被转换到内部查询指定435。包括过滤谓词的查询被转发到查询核,且获得匹配该过滤的连续行的组块,以及它们出现在何处的位置,从这些组块中,计算“所选”窗口而不必在该情况下进行任何排序。对于未过滤的但已排序的查询,这同样是更一般的“已过滤且已排序查询”(将在以下更详尽论述)的简化情况。在这一具体情况下,不必应用任何实际的过滤,而需要输出已排序的数据。该数据然后根据表达式440由查询核450来过滤,查询核450对基于压缩列的值序列460进行查询。查询核450然后返回包含匹配该过滤的行号和连续行号(c行号)的行430。如上所述,可使用轻量数据高速缓存425来支持处理和合并运算420来形成行集输出415。在这一点上,注意,已排序列上的分布影响所选的执行计划。此处执行的各种高效过滤和排序运算的简化概览是对一般情况执行相同操作,除了过滤谓词不被推送到查询核之外。在某一时刻,获得包含(已排序列的数据ID、行号、c行号)的行组块,并且使用这些组块来按照对于以上较简单的情况(ISAM和已过滤但未排序情况)描述的相同的方式来构
建行集。对于涉及对大量数据的过滤和排序的查询,如果查询涉及过滤或0RDERBY子句, 则确定一执行计划来满足该请求。实际计划取决于数据模式,其因素包括将对其执行排序的列上的数据ID的分布和基数。下节更详细地细查了这一情况,并描述了数据分布和模式如何能影响执行计划。关于用于已排序列的不同数据分布的执行计划,图5是可能遇到的一列潜在数据分布500、510、520、530。对这些情况500、510、520、530中的每一个的处理在下文中更详细描述,为便于说明以最简单的情况开始,然后一般化到较复杂的情况。在图5中,χ轴上是不同的数据ID,而y轴上表示数据ID的频率(有多少重复)。情况500示出了具有许多重复的分布,例如,具有合理数量的不同数据ID,但没有偏态的情况。这在该情形中一般被称为“好”基数,因为存在合理数量的不同数据ID,每一数据ID具有许多重复,而没有任何极端的“偏态”情况(其中例如一半的值匹配单个数据 ID)。情况500的示例可包括其中与表内的行数相比存在数量少得合理的不同数据ID 的均勻、标准分布或任何其他分布,即,ι << I不同数据IDl << ι表内的行数I。“好”基数的一个示例可能是具有最多例如一百万个不同数据ID的表,不包括偏态分布。可以在这些类型的分布上利用的性质是平均来说一个数据ID被重复多次,并且由此,可跟踪描述对应于每一数据ID的出现次数的统计量(直方图),例如,可存在十亿行, 但是仅有一百万个不同数据ID。由此,可以实现将保持已排序数据ID以及出现次数的准确直方图,例如以分层结构处理时间来计算。在这一点上,注意,该直方图是“已排序的”。结果,可以维护移动和(running sum) 而非实际计数,其中计数可以通过查看下一数据ID来计算。如需要,对于反向排序次序,可通过从实际计数中减去物化的移动和来计算反向移动和。以下表I进一步示出了移动和的概念。
权利要求
1.一种用于处理数据的设备,包括至少一个查询处理器220,所述查询处理器基于为数据存储中的值在目标窗口内的分布而计算的直方图来处理对加窗的数据子集的查询;以及编码器210,所述编码器用于响应于所述查询将接收到的加窗的数据子集编码为对应于不同数据列的值的整数编码和压缩序列。
2.如权利要求1所述的设备,其特征在于,所述统计量是动态且取决于WHERE和ORDER BY来获得的,以用于将数据加窗到目标窗口的目的。
3.如权利要求1所述的设备,其特征在于,所述统计量是为真实数据构建的,并且对于合成数据值,数据首先根据离散化过程来离散化。
4.如权利要求3所述的设备,其特征在于,合成的、离散化的数据作为一种形式的联接列来被对待以便参与ORDER BY运算。
5.如权利要求1所述的设备,其特征在于,一旦分析了ORDER BY运算所蕴含的列的内容之后,在第二次扫描之前不生成最终窗口。
6.如权利要求1所述的设备,其特征在于,预先计算的分层结构数据被用来模拟至少某些合成的、离散化的列。
7.如权利要求1所述的设备,其特征在于,选择算法被用来基于查询定义、从所述统计量确定的目标窗口的内容、或并行化程度中的至少一个选择用于离散化数据的离散化方法以及用于所述查询的缓存策略。
8.如权利要求1所述的设备,其特征在于,基于WHERE和ORDERBY数据桶的内容以及从统计量确定的目标窗口的内容来选择投影方法。
9.如权利要求1所述的设备,其特征在于,所述最终窗口是仅使用对1到最多N个预配置缓存的插入来并行构建的,其中N对应于所述设备的处理器数量。
10.如权利要求1所述的设备,其特征在于,用于缓存数据的内部缓存是基于查询指定、所选离散化方法、通过直方图确定的最终窗口中的数据分布、或应用于数据处理的并行化程度中的至少一个,根据缓存大小及其策略来配置的。
11.一种用于处理数据的方法,包括从应用接收2110蕴含对至少一个数据存储中的数据的至少一个过滤或排序运算以便检索应用于局部窗口的数据子集的查询;计算关于对所述查询的任何指定的WHERE子句和/或ORDER BY列的行分布的统计量 2120,基于所述统计量,对所述至少一个过滤或排序运算确定2130与所述局部窗口匹配的至少一个结果集;以及将所述至少一个结果集发送2140到所述应用。
12.如权利要求1所述的方法,其特征在于,还包括高速缓存2230所述统计量以便至少部分地重用。
13.如权利要求1所述的方法,其特征在于,所述确定2130包括用多个处理器以及对应数量的数据段来并行化所述查询所定义的运算,每一段由至少一个不同处理器来处理。
14.一种包括用于执行如权利要求1所述的方法的计算机可执行指令的计算机可读介质。
15.一种用于查询处理的方法,包括从应用传送2210蕴含对至少一个数据存储中的数据的至少一个过滤或排序运算以便检索应用于局部窗口的数据子集的查询;基于关于对所述查询的任何指定的WHERE子句或ORDER BY列的行分布的统计量,接收 2220对于所述至少一个过滤或排序运算的、与所述局部窗口匹配的至少一个结果集。
16.如权利要求15所述的方法,其特征在于,还包括基于关于成本和数据重用的可能性的策略来高速缓存2230结果。
17.如权利要求15所述的方法,其特征在于,还包括动态地确定2120取决于WHERE和 ORDER BY的所述统计量,以用于将数据加窗到所述局部窗口的目的。
18.如权利要求15所述的方法,其特征在于,还包括在确定所述统计量之前,离散化 700合成数据值来形成合成的离散化数据。
19.如权利要求18所述的方法,其特征在于,还包括在列联接期间使用所述合成的离散化数据来参与ORDER BY运算。
20.如权利要求15所述的方法,其特征在于,在分析了ORDER BY运算所蕴含的列的内容之前,等待生成用于所述目标窗口的最终窗口。
全文摘要
本发明的公开内容涉及对基于列的数据编码结构的查询,其实现了对大规模数据存储的高效的查询处理,尤其是对于蕴含了对定义的窗口上的数据的过滤和/或排序运算的复杂查询的处理。在这一点上,在各实施例中,提供了一种通过完全不对任何行进行排序,或者通过仅对与关联于数据上的所请求的窗口的大小的行数相一致或小于该行数的非常少量的行进行排序,来避免涉及对高百分比的行或所有行的昂贵排序的情形的方法。在一个实施例中,这是通过将外部查询请求拆分成两个不同的内部子请求来实现的,其中第一个子请求对于任何指定的WHERE子句和ORDER BY列计算关于行分布的统计量,而第二个子请求基于该统计量来仅选择匹配该窗口的行。
文档编号G06F17/30GK102171680SQ200980139978
公开日2011年8月31日 申请日期2009年9月30日 优先权日2008年10月5日
发明者A·I·普雷代斯库, A·耐茨, C·佩特克勒斯克, M·杜米特鲁 申请人:微软公司

最新回复(0)