在 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