【连载】关系型数据库是如何工作的?(11) - 查询管理器之rewriter
来源:互联网 发布:typedef struct node 编辑:程序博客网 时间:2024/04/28 00:06
在重写这一步,我们拿到了查询SQL的内部表示,重写的目的是:
- 预优化SQL
- 避免不必要的操作
- 帮助优化器找到尽可能好的解决方案
重写器会在查询上匹配一系列规则,如果匹配一个规则就应用它重写查询,以下是部分可选的规则:
- 视图合并:如果你在查询中用了视图,那么视图就会被转换为一段代码;
- 优化子查询:由于一个子查询非常难以优化,因此重写器会修改子查询并删除子查询。
例如:
SELECT PERSON.*FROM PERSONWHERE PERSON.person_key IN(SELECT MAILS.person_keyFROM MAILSWHERE MAILS.mail LIKE 'christophe%');
会被重写器转换为:
SELECT PERSON.*FROM PERSON, MAILSWHERE PERSON.person_key = MAILS.person_keyand MAILS.mail LIKE 'christophe%';
- 移除不必要的操作:如果在某个或某组字段上使用了DISTINCT关键字,但是同时在这些字段上又增加了防止数据不唯一的唯一性约束,则重写器会移除DISTINCT;
- 移除多余的join:如果两次使用同一个join条件(可能是一个join条件被视图所隐藏),或者可能因为传递性导致一个不必要的join,它们都会被移除;
- 数学常量代换:如果你使用了一些数学运算,那么它只会被重写器计算一次。例如WHERE AGE > 10+2会被转换为WHERE AGE > 12、TODATE(“some date”) 会被转换为DateTime类型的日期;
- (高级)分区优化:如果你使用的是分区表,重写器会找到实际使用的分区;
- (高级)物化视图重写:如果有物化视图匹配查询的子集,重写器会检查其是否是最新的,并用物化视图替换实际的表;
- (高级)定制规则:如果你为了修改查询(像Oracle策略)定制了一些规则,重写器会执行这些规则;
重写后的查询会被转发给优化器继续处理。
1 0
- 【连载】关系型数据库是如何工作的?(11) - 查询管理器之rewriter
- 【连载】关系型数据库是如何工作的?(10) - 查询管理器之parser
- 【连载】关系型数据库是如何工作的?(12) - 查询管理器之Statistics
- 【连载】关系型数据库是如何工作的?(13) - 查询管理器之Access Path
- 【连载】关系型数据库是如何工作的?(14) - 查询管理器之Nested Join
- 【连载】关系型数据库是如何工作的?(15) - 查询管理器之Hash Join
- 【连载】关系型数据库是如何工作的?(16) - 查询管理器之Merge Join
- 【连载】关系型数据库是如何工作的?(17) - 查询管理器之优化示例
- 【连载】关系型数据库是如何工作的?(18) - 查询管理器之动态编程
- 【连载】关系型数据库是如何工作的?(19) - 查询管理器之贪婪算法
- 【连载】关系型数据库是如何工作的?(20) - 查询管理器之优化器
- 【连载】关系型数据库是如何工作的?(9) - 查询管理器
- 【连载】关系型数据库是如何工作的?(8) - 客户端管理器
- 【连载】关系型数据库是如何工作的?(5)
- 【连载】关系型数据库是如何工作的?(7) - 数据库架构视图
- 【连载】关系型数据库是如何工作的?(1) - 前言
- 【连载】关系型数据库是如何工作的?(2) - 时间复杂度
- 【连载】关系型数据库是如何工作的?(3) - 归并排序
- 前言
- 检测录音程序是否被禁用 录音权限
- cookie和session详解
- 抓妖怪项目(踩坑)总结
- 二十二、外观设计模式
- 【连载】关系型数据库是如何工作的?(11) - 查询管理器之rewriter
- Tomcat
- IO流----文件字节流、文件字符流
- C++ Singleton (单例) 模式最优实现
- DOM中的三种类型的节点:元素节点,属性节点,文本节点
- MySQL创建用户与授权方法
- Sqlite基础
- leetcode 82-- Remove Duplicates from Sorted List II 链表 双指针 删除元素
- g++起步