关系型数据库工作原理-SQL重写(翻译自Coding-Geek文章)

时间:2023-02-18 08:53:39

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

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

关系型数据库工作原理-SQL重写(翻译自Coding-Geek文章)

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