本文翻译自Coding-Geek文章:《 How does a relational database work》。原文链接:http://coding-geek.com/how-databases-work/#Buffer-Replacement_strategies

本文翻译了如下章节, 介绍数据库的SQL重写器组件:

Query rewriter -查询重写器

在这个处理环节,开发人员写的SQL语句会被转换为一种DBMS内部的表示方式。重写SQL有三个目的:

  1. 对SQL语句做提前优化(译者:相当于C++里面的预编译)。
  2. 去除SQL中冗余的操作。
  3. 帮助优化器找到最好的优化方案。

重写器会对SQL语句按一定的规则做处理。如果SQL语句符合某条规则的条件,规则就会执行,然后SQL被重写。下面是一些规则的例子:

  1. View merging(视图替换):如果在SQL中使用了视图,视图将被用视图SQL代码替换(译者:相当于C++中的宏替换)。

  2. 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%';
  1. Removal of unnecessary operators(去除无用的操作):例如将DISTINCT应用到一个已定义为UNIQUE的字段上,DISTINCT将被去掉。

  2. Redundant join elimination(去除多余的连接条件):如果在SQL中有两个相同的连接条件(可能是视图已经隐含了连接条件),那么多余的连接条件将去掉。

  3. Constant arithmetic evaluation(常量运算): 如果在SQL中使用了算术运算,重写器将提前计算好结果。例如:WHERE AGE > 10+2将被转换为AGE > 12;TODATE(“some date”)将被转换为对应Date的时间戳格式。

  4. (Advanced) Partition Pruning(分区裁决):如果使用了分区表,重写器将提前找出将使用哪些分区。

  5. (Advanced) Materialized view rewrite(物化视图重写):

    如果有一个物化视图与查询语句匹配,且该物化视图数据是最新的。重写器会修改SQL以访问物化视图来代替原始表。

  6. (Advanced) Custom rules(自定义规则): 如果你有定义规则来重写查询SQL,重写器将会执行这些规则。

  7. (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语句将被送到查询优化器做进一步处理。

最新文章

  1. Java-Spring:java.lang.ClassCastException: com.sun.proxy.$Proxy* cannot be cast to***问题解决方案
  2. 三、基础功能模块,用户类别管理——锁、EF并发处理、领域服务、应用服务的划分
  3. java项目导入IntelliJ IDEA
  4. python_way day14 HTML
  5. python Django 学习笔记(五)—— Django admin自动管理界面
  6. 《Java数据结构与算法》笔记-CH5-链表-4用链表实现堆栈
  7. 构建项目AppFuse+QuickStart
  8. 《Head First HTML&CSS》笔记
  9. web 缓存
  10. Node.js脚本杀掉占用端口的进程
  11. Oracle系统视图
  12. linux中php配置
  13. UNIX网络编程——并发服务器(TCP)
  14. mac 重装系统
  15. openvpn搭建
  16. ssh自动登录,脚本实现
  17. 【译】10. Java反射——数组
  18. python第五十课——多态性
  19. PAT L2-011 玩转二叉树
  20. MySQL存储过程整理

热门文章

  1. 变态的IE
  2. hdu3480 Division(dp平行四边形优化)
  3. win10外接键盘失灵
  4. 1.3 fractions模块
  5. hdu3016 线段树+简单DP
  6. Node 定时器详解
  7. window下如何使用Git上传代码到github远程服务器上(转)
  8. 常用u-boot命令详解(全) 2
  9. PCI和PCIE插槽有什么区别?
  10. linux shell中获取mongodb最大连接数、内存使用情况等