本文共 710 字,大约阅读时间需要 2 分钟。
在 SQL 语句中,经常会有 A=B 这样的约束条件,它的操作符是等值操作符。我们将这种等值约束条件称为“等价条件”,而基于多个等价条件进行推理而获得的等价属性的集合就是“等价类”。
假如等价约束条件中的一端是常量,这种等价的推理就会显得更有意义。假如有两个约束条件 A=B 和 B=5,从谓词下推的角度来看,A=B 肯定只能作为一个连接条件。只有在连接操作做完之后,A=B 这样的约束条件才能获得约束条件两端的值。因此,这个约束条件是没有办法下推的,对于 B=5 这样的约束条件呢?如果是内连接的话,通常而言它是能下推的。
如果能通过 A=B 和 B=5 这样的两个约束条件推理出一个新的 A=5 的约束条件,由于 A=5 这样的单属性(只涉及一个表)约束条件或许能够下推到单表上,这样就可以在对表进行扫描的时候把没用的元组过滤掉,从而提高执行的效率。
例如 SQL 语句 SELECT * FROM TEST_A a,TEST_B b WHERE a.a = b.a AND b.a = 5,本来只能在连接结果产生之后使用 a.a = b.a 对连接结果进行过滤。但是如果推理出 b.a = 5 这样一个过滤条件,那么就能把这个过滤的操作下推到对 TEST_A 表的扫描上。如下面的示例所示,的确产生了新的约束条件 a.a = 5。
从执行计划中还可以看出,a.a = b.a 这个约束条件也被消除掉了,这是因为做扫描操作的时候已经把不等于 5 的数据过滤掉了,只有等于 5 的数据才能被返回给嵌套循环连接结点。由此,在嵌套循环连接结点再做一次 a.a = b.a 就显得有点多余了。
postg
转载地址:http://koyni.baihongyu.com/