博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第13课:表达式提取
阅读量:4074 次
发布时间:2019-05-25

本文共 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/

你可能感兴趣的文章
大数相乘不能用自带大数类型
查看>>
字节跳动后端开发一面
查看>>
CentOS Tensorflow 基础环境配置
查看>>
centOS7安装FTP
查看>>
FTP的命令
查看>>
CentOS操作系统下安装yum的方法
查看>>
ping 报name or service not known
查看>>
FTP 常见问题
查看>>
zookeeper单机集群安装
查看>>
do_generic_file_read()函数
查看>>
Python学习笔记之数据类型
查看>>
Python学习笔记之特点
查看>>
shell 快捷键
查看>>
VIM滚屏操作
查看>>
EMC 2014存储布局及十大新技术要点
查看>>
linux内核内存管理(zone_dma zone_normal zone_highmem)
查看>>
将file文件内容转成字符串
查看>>
循环队列---数据结构和算法
查看>>
优先级队列-数据结构和算法
查看>>
链接点--数据结构和算法
查看>>