[数据库系统]关系代数表达式的优化算法
Algorithm:关系代数表达式的优化算法
Input:一个关系代数表达式的语法树
Output:计算该表达式的程序
思路:
- 选择运算应尽可能先做
- 把投影运算和选择运算同时进行:这两者都是一元操作,一个元组能不能成为结果只取决于其本身
- 把投影同其前或后的双目运算结合起来
- 把某些选择同在它前面要执行的笛卡儿积结合起来称为一个连接运算
- 找出公共子表达式
Method:
(S1)依据定理L4,把形如σF1∩F2∩…∩Fn(E))σ_{F_1∩F_2 ∩ … ∩ F_n} (E))σF1∩F2∩…∩Fn(E))的选择表达式变成串接形式σF1(σF2(…(σFN(E))))σ_{F_1}(σ_{F_2}(…(σ_{F_N} (E))))σF1(σF2(…(σFN(E)))).
(S2)对每个选择,依据定理L4至L9,尽可能把它移至树的底部。
S3)对每个投影,依据定理L3,L7,L10和L5,尽可能把它移至树的底部。
(S4)依据定理L4至L5把串接的选择和投影组合为单个选择、单个投影,或者一选择后跟一个投影。
(S5)对修改后的语法树,将其内结点按以下方式分组: 每个二元运算结点(积、并、差、连接等)和其所有一元运算直接祖先结点放在一组;对于其后代结点,若后代结点是一串一元运算且以树叶为终点,则将这些一元运算结点放在该组中;若该二元运算结点是笛卡儿积,且其后代结点不能和它组合成等连接,则不能将后代结点归入该组。
(S6)产生一个程序:它以每组结点为一步,但后代组先执行。
例如:
查出1978年1月1日前被借出的所有书的书名
XLOANS是面向用户的一个视图
SELECT Title FROM XLOANS WHERE Date<=1/1/78
转换为关系代数表达式:
ΠTITLE(σDATE<=“1/1/78”(Π_{TITLE}(σ_{DATE<=“1/1/78”}(ΠTITLE(σDATE<=“1/1/78”(XLOANS))))))
再将视图XLOANS替换为视图的定义,得到下图右面的语法树
接下来我们就要对这颗语法树来进行优化
首先依据定理L4,把形如σF1∩F2∩…∩Fn(E))σ_{F_1∩F_2 ∩ … ∩ F_n} (E))σF1∩F2∩…∩Fn(E))的选择表达式变成串接形式
σF1(σF2(…(σFN(E))))σ_{F_1}(σ_{F_2}(…(σ_{F_N} (E))))σF1(σF2(…(σFN(E)))).
对于语法树中的选择条件:
即可将语法树中的σFσ_{F}σF拆开变成串接形式,即为σF2∩F3=σF2(σF3)σ_{F_2∩F_3}=σ_{F_2}(σ_{F_3})σF2∩F3=σF2(σF3)
然后第二步:对每个选择,依据定理L4至L9,尽可能把选择移至树的底部(尽可能地早做选择和投影)。
σF1σ_{F_1}σF1通过交换移动到底部
σF2σ_{F_2}σF2 通过交换移动到底部
σF3σ_{F_3}σF3移动不了
因为ΠSΠ_SΠS经过ΠtitleΠ_{title}Πtitle投影已经没有意义了,所以Πtitle(Πs)=ΠtitleΠ_{title}(Π_{s})=Π_{title}Πtitle(Πs)=Πtitle
第三步是继续对投影运算进行移动,对每个投影,依据定理L3,L7,L10和L5,尽可能把它移至树的底部,如果一个投影是对某表达式所有属性进行的,则去掉之。
首先,ΠtitleΠ_{title}Πtitle移动不下去(因为首先ΠtitleΠ_{title}Πtitle就不包含F3F_3F3涉及的属性),就将其转换,使其包含F3F_3F3涉及的属性,然后再向下移动
然后
类似处理BORROWERS和LOANS的投影
然后对修改后的语法树,将其内结点按以下方式分组: 每个二元运算结点(积、并、差、连接等)和其所有一元运算直接祖先结点放在一组;对于其后代结点,若后代结点是一串一元运算且以树叶为终点,则将这些一元运算结点放在该组中;若该二元运算结点是笛卡儿积,且其后代结点不能和它组合成等连接,则不能将后代结点归入该组。
[数据库系统]关系代数表达式的优化算法相关推荐
- Dropout、梯度消失/爆炸、Adam优化算法,神经网络优化算法看这一篇就够了
作者 | mantch 来源 | 知乎 1. 训练误差和泛化误差 对于机器学习模型在训练数据集和测试数据集上的表现.如果你改变过实验中的模型结构或者超参数,你也许发现了:当模型在训练数据集上更准确时, ...
- 深度学习中的优化算法与实现
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 GiantPandaCV导语:这篇文章的内容主要是参考 沐神的mxnet/gluon视频中,Aston ...
- 深度学习基础(基本概念、优化算法、初始化、正则化等)
2020-04-25 16:29:09 引言 深度学习目前已成为发展最快.最令人兴奋的机器学习领域之一,许多卓有建树的论文已经发表,而且已有很多高质量的开源深度学习框架可供使用.然而,论文通常非常简明 ...
- 智能优化算法之蚁群算法(1)
蚁群算法(ant colony algorithm) : 一种模拟进化算法 蚂蚁在觅食过程中能够在其经过的路径留下一种称为信息素的物质,并在觅食的过程中能感知这种物质的强度,并指导自己的行动方向,他们 ...
- 【深度学习】一文搞定面试中的优化算法
深度学习各类优化器 借用古代炼丹的一些名词,我们可以把训练模型中的数据比做炼丹药材,模型比做炼丹炉,火候比做优化器.那么我们知道,同样的药材同样的炼丹炉,但是火候不一样的话,炼出来的丹药千差万别,同样 ...
- 【机器学习基础】优化算法详解
本文来源于吴恩达老师的深度学习课程[1]和深度学习课程[2]笔记部分. 作者:黄海广[3] 备注:笔记和作业(含数据.原始作业文件).视频都在 github[4]中下载. 导语 在学习机器学习的过程中 ...
- 从动力学角度看优化算法:为什么学习率不宜过小?
©PaperWeekly 原创 · 作者|苏剑林 单位|追一科技 研究方向|NLP.神经网络 本文的主题是"为什么我们需要有限的学习率",所谓"有限",指的是不 ...
- 2.2)深度学习笔记:优化算法
目录 1)Mini-batch gradient descent(重点) 2)Understanding mini-batch gradient descent 3)Exponentially wei ...
- 神经网络中的优化算法总结
在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯度下降,还是Adam方法? 这篇文章介绍了不同优化算法之间的主要区别,以及如何选择最佳 ...
- 优化算法笔记|粒子群算法理解及Python实现
粒子群算法的理解及Python实现 1.粒子群算法概述 2 基本PSO算法流程图 3 粒子群算法的Python实现 1.粒子群算法概述 粒子群算法 来源于对鸟群捕食模型的修正. 假设在一个n维空间中, ...
最新文章
- 图论 ---- F. Useful Edges(不等式移项优化预处理 + 路径和简单路径的区别 + 最短路)
- 【Windows10 IoT开发系列】开发人员模式设置
- 光流 | 使用Horn-Schunck方法进行光流估计(附代码)
- 战斗民族开源神器。ClickHouse为什么能够征服各个大厂?
- linux修改文件句柄数生效_修改Linux的open files参数是,立即生效,无需重启
- HDU 4864 Task(贪心或高斯消元)
- .net core自定义高性能的Web API服务网关
- CF1479A Searching Local Minimum
- MyBatis中Mapper代理方式
- vs visual studio 2015安装后的几个问题
- 看printk引发的一点思考
- android bitmap对比,Android Bitmap和Drawable的对比
- php 判断两个数组是否相等
- 升级到android studio 4.1后检测不到flutter、Dart插件
- 如何在Unity项目中添加语音识别?
- [转载]Web前端开发工程师编程能力飞升之路
- strdup linux,内存管理 – Linux内核API kstrdup
- 数据版吐槽大会: 国产综艺节目年终盘点
- 依图三变,“退群”AI四小龙
- qq三国华容道算法(拼图问题,8数码问题?)
热门文章
- DHCP Option 82
- Android车牌识别SDK
- Android本地音乐播放器
- Kubernetes监控体系(1)-cAdvisor介绍
- Prometheus客户端docker监控cAdvisor
- python开发ps插件_【UI/UE】22款设计师必备的PS插件【附教程】
- RDIFramework.NET ━ .NET快速信息化系统开发框架-4.5 用户管理模块
- Java数据结构与算法之堆排序
- Linux ——vi / vim 新建文件vi abc.txt 、编辑文件 i、退出编辑 esc、保存文件:wq、打开文件所在目录 open . 、使用命令打开文件 open ./abc.txt。
- 彻底删除BootCamp Windows分区和合并到Mac分区中教程