关系型数据库工作原理-SQL重写(7)

     本文翻译自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被重写。下面是一些规则的例子:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值