本节主要介绍关系表达式的等价规则转换。如下所示列举了一些常见的规则,在这些规则的基础上,还能推导出更多规则。
接下来简单介绍几个规则,其他规则的详细内容可以查阅相关资料进行研究。
-
第一个规则是在 E 表上选择满足 θ1 和 θ2 两个条件的属性。它可以分解为先对 E 表做 θ2 条件的选择,再做满足 θ1 条件的选择。因为这个规则的意思是选择两个过滤条件的交集部分。
-
第二个规则说明多次的选择,是满足交换率的。可以先做 θ2 的选择,也可以先做 θ1 的选择。
-
第三个规则的意思是多次的投影可以简化为单次的投影。
-
第四个规则主要关于笛卡尔积转连接,a 规则是说可以在连接的过程中直接进行过滤,而不用先做完全部的笛卡尔积操作再进行过滤。b 规则表示在连接的基础上再进行一次过滤,本质上跟 a 规则是一样的。
为帮助大家理解,接下来讲解一个示例。
这个示例中有三个关系,分别是表 instructor、teaches、course。通常来说迭代算法一般是从左边的算子开始迭代,也就是最左端的表是最先进行运算的。从右上角这个查询计划 (a) 中可以看出 instructor 表连接的关系其实是 teaches 表与 course 表投影的中间关系上的连接。在这个过程中,消耗是比较大的,因为在进行第一个连接的时候,需要先保存 teaches 表和 course 表连接的中间结果,这样代价是比较大。
接下来看一下,经过前面介绍的规则改写之后,这个查询计划会发生什么样的变化。
首先利用规则 6.a,先不进行 teaches 表和 course 表的投影的中间关系的连接,而是先将 instructor 表和 teaches 表进行连接,再利用规则 7.a 将选择下推。也就是说,这里的选择 dept_name 和 year 其实是 instructor 表和 teaches 表上的属性,可以看到图中红框部分,把选择条件下推到连接上了。
然后单独看红框的部分,由于这两个选择的属性涉及到了两张表,因此可以利用规则 7.b 将这个选择条件分解,下推到两张表上,再进行一个连接。可以看到最终优化生成的连接计划,也就是图中右下角的查询计划 (b)。
经过优化之后,查询计划形状变得更加左偏了。在这种情况下,instructor 表和 teaches 表进行连接的时候,首先第一个保存的临时关系变成了 teaches 表选择之后的一个中间临时关系,然后得到中间连接结果之后,生成临时关系就可以不用保存了。而优化之前的计划,是在连接之前需要保存一个较大的中间临时关系。因此在关系代数的基础上进行等价规则的转换可以帮助优化查询计划。