关系型数据库工作原理-SQL重写(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:《 How does a relational database work》。原文链接:http://coding-geek.com/how-databases-work/#Buffer-Replacement_strategies
本文翻译了如下章节, 介绍数据库的SQL重写器组件:
Query rewriter -查询重写器
在这个处理环节,开发人员写的SQL语句会被转换为一种DBMS内部的表示方式。重写SQL有三个目的:
- 对SQL语句做提前优化(译者:相当于C++里面的预编译)。
- 去除SQL中冗余的操作。
- 帮助优化器找到最好的优化方案。
重写器会对SQL语句按一定的规则做处理。如果SQL语句符合某条规则的条件,规则就会执行,然后SQL被重写。下面是一些规则的例子:
View merging(视图替换):如果在SQL中使用了视图,视图将被用视图SQL代码替换(译者:相当于C++中的宏替换)。
Subquery flattening(子查询展开):有子查询的SQL语句是很难做优化的,改写器将试图修改查询语句以去除子查询。
例如下面的SQL语句:
SELECT PERSON.* FROM PERSON WHERE PERSON.person_key IN (SELECT MAILS.person_key FROM MAILS WHERE MAILS.mail LIKE 'christophe%');
将被重写成这样:
SELECT PERSON.* FROM PERSON, MAILS WHERE PERSON.person_key = MAILS.person_key and MAILS.mail LIKE 'christophe%';
Removal of unnecessary operators(去除无用的操作):例如将DISTINCT应用到一个已定义为UNIQUE的字段上,DISTINCT将被去掉。
Redundant join elimination(去除多余的连接条件):如果在SQL中有两个相同的连接条件(可能是视图已经隐含了连接条件),那么多余的连接条件将去掉。
Constant arithmetic evaluation(常量运算): 如果在SQL中使用了算术运算,重写器将提前计算好结果。例如:WHERE AGE > 10+2将被转换为AGE > 12;TODATE(“some date”)将被转换为对应Date的时间戳格式。
(Advanced) Partition Pruning(分区裁决):如果使用了分区表,重写器将提前找出将使用哪些分区。
(Advanced) Materialized view rewrite(物化视图重写):
如果有一个物化视图与查询语句匹配,且该物化视图数据是最新的。重写器会修改SQL以访问物化视图来代替原始表。(Advanced) Custom rules(自定义规则): 如果你有定义规则来重写查询SQL,重写器将会执行这些规则。
(Advanced) Olap transformations(多维分析转化): analytical/windowing functions, star joins, rollup … are also transformed (but I’m not sure if it’s done by the rewriter or the optimizer, since both processes are very close it must depends on the database).
重写后的SQL语句将被送到查询优化器做进一步处理。
最新文章
- Java-Spring:java.lang.ClassCastException: com.sun.proxy.$Proxy* cannot be cast to***问题解决方案
- 三、基础功能模块,用户类别管理——锁、EF并发处理、领域服务、应用服务的划分
- java项目导入IntelliJ IDEA
- python_way day14 HTML
- python Django 学习笔记(五)—— Django admin自动管理界面
- 《Java数据结构与算法》笔记-CH5-链表-4用链表实现堆栈
- 构建项目AppFuse+QuickStart
- 《Head First HTML&;CSS》笔记
- web 缓存
- Node.js脚本杀掉占用端口的进程
- Oracle系统视图
- linux中php配置
- UNIX网络编程——并发服务器(TCP)
- mac 重装系统
- openvpn搭建
- ssh自动登录,脚本实现
- 【译】10. Java反射——数组
- python第五十课——多态性
- PAT L2-011 玩转二叉树
- MySQL存储过程整理