论文部分内容阅读
子查询及分组和聚集操作是SQL语言中的重要特性,有着非常广泛的应用。随着决策支持系统、数据仓库、OLAP系统越来越普及,这两种操作的应用也变得越来越广泛。因此,如何高效的处理这两类操作成为了一个重要的问题。 早期的关系数据库管理系统,均采用了一种最容易理解和实现的方式处理子查询和分组及聚集操作:(1)传统优化器采用嵌套执行的方式处理子查询,即在处理父查询的过程中,对每一条元组,都执行一次子查询;(2)对分组和聚集操作,传统优化器按照SQL标准中规定的语义,首先执行所有的连接和选择操作,最后,对连接和选择操作的结果,进行分组和聚集操作。 上述处理方式虽然易于实现,但执行效率可能会非常低,或者至少不是最优的。这是因为:(1)对子查询,嵌套执行方式相当于进行嵌套循环连接,很显然,这个连接操作的的连接顺序和连接方法都是确定的。我们知道,不同的连接顺序或连接方法可能导致连接的效率相差数个数量级。因而,如果该子查询能够被转化成某种连接操作,通过对该连接选择不同的顺序和方法,很可能会大大提高查询效率;(2)对分组和聚集操作,由于分组可能大大减小原关系的大小,若在进行连接操作之前,首先对连接操作的操作关系进行分组和聚集,该连接操作的效率就有可能得到很大提高。但是需要注意的是,分组操作本身也是有开销的,因此,这种处理方式在降低了连接操作的开销的同时,也增加了新的开销。然而不论如何,这种方法都提供了一种提高查询效率的可能。 鉴于此,人们针对子查询和分组聚集操作的查询优化做了大量的研究工作。尽管如此,许多现有的数据库管理系统对这两类查询的执行依然采用的是传统的执行方法。这是因为,一方面查询的结构非常复杂;另一方面,很难找到合适的代数转换规则,能够有效的处理所有的情况;再者,即便找到了合适的规则,由于这些规则都不能保证重写一定可以提高查询效率,因此,要将这些规则集成导已有的查询优化器中也必须进行许多取舍。本文的研究目标是针对上述问题,提出一种在已有的系统中集成这类规则的实现方案。 本文的研究内容是针对Kingbase ES数据库系统,通过分析KingbaseES查询优化器的体系结构及其对子查询和分组及聚集操作的处理方法,提出基于Kingbase ES系统的子查询消除以及分组和聚集操作与连接操作的位置交换问题。 对子查询的消除问题,我们首先将子查询按照复杂程度分为三类:SPJ子查询(由选择、连接、投影操作组成的查询)、GroupBy子查询(由选择、连接、投影、分组、聚集操作组成的查询)和Top-N子查询(GroupBy子查询中再加上Top-N操作)。然后,通过分析已有的子查询消除方法(如[KIM82],[Day87],[SPL96],[CM01]等),我们对SPJ子查询和GroupBy子查询,按照Kingbase ES中的分类方法,分别给出并证明了通过连接、左外连接、半连接以及反半连接操作来消除子查询的方法。最后,我们给出了将这些方法集成到Kingbase ES中的实现算法。注意,由于Top-N操作并不属于基本的关系代数操作,这类子查询很难被消除,因此,我们不分析这种情况,实际上,这类子查询在应用中也是比较少见的。 对分组和聚集操作与连接操作的位置交换问题,我们首先分析了已有的方法,并采用[CS94]中的转换规则来进行代数变换。前面已经提到这种转换不能保证查询效率一定得到提高,因此,我们采用基于代价的方式来将其集成到Kingbase ES的查询优化其中。 本文的主要贡献和创新如下: 分析了已有的子查询消除和GroupBy操作下移/上移算法,对这些算法进行了扩展和削减,提出了基于Kingbase ES查询优化器的相应算法;分析并证明了Kingbase ES中已有的对这两类操作的处理方法的正确性,将新的算法与原算法合并,并在Kingbase ES系统中实现了这些算法。 对(θ)半连接/(θ)反半连接操作符进行了深入分析,并证明了这两种操作满足的代数转换规则;利用这些转换规则,提出并证明实现了涉及到ANY、ALL、EXISTS这类返回结果为一个集合的子查询的消除方法;在Kingbase ES数据库的执行引擎中实现了这两种操作。