本文共 662 字,大约阅读时间需要 2 分钟。
如果有这样一条 SQL 语句:
SELECT * FROM STUDENT, COURSE WHERE (sno =1 AND cname=’math’) OR (sno = 2 AND cname = ‘physics’),
在对谓词做表达式预处理的时候,我们对这种类型的约束条件无从下手。我们知道 PostgreSQL 的约束条件的顶层是合取范式(或者说是“与”的方式),但这里的顶层是一个析取范式,这样的约束条件也只能应用到 STUDENT 表和 COURSE 表的连接结果上,对连接操作产生的结果进行过滤。如果有办法对其中的一些条件提取出来,并且下推到基表上,那么就会降低连接操作的计算量。
通过分析 (sno =1 AND cname='math') OR (sno = 2 AND cname = 'physics') 这个约束条件就会发现,它是 OR 谓词连接起来的两个合取范式: (sno =1 AND cname='math') 和 (sno = 2 AND cname = 'physics') ,这样的连接条件产生的结果有什么特点呢?
对于 STUDENT 表而言,能够顺利通过这两个合取范式过滤的元组,一定具有这样的特征:sno = 1 或 sno = 2。同理,对于 COURSE 表而言,也能够得到一个类似的特征:cname = 'math' 或 cname = 'physics'。
结合之前提到过的谓词下推,会发现 sno = 1 或 sno = 2 这样的约束条件是能下推的。
转载地址:http://rayni.baihongyu.com/