当前位置:Gxlcms > 数据库问题 > 【连载】关系型数据库是如何工作的?(11) - 查询管理器之重写

【连载】关系型数据库是如何工作的?(11) - 查询管理器之重写

时间:2021-07-01 10:21:17 帮助过:2人阅读

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%‘;
  • 移除不必要的操作:如果在某个或某组字段上使用了DISTINCT关键字,但是同时在这些字段上又增加了防止数据不唯一的唯一性约束,则重写器会移除DISTINCT;
  • 移除多余的join:如果两次使用同一个join条件(可能是一个join条件被视图所隐藏),或者可能因为传递性导致一个不必要的join,它们都会被移除;
  • 数学常量代换:如果你使用了一些数学运算,那么它只会被重写器计算一次。例如WHERE AGE > 10+2会被转换为WHERE AGE > 12、TODATE(“some date”) 会被转换为DateTime类型的日期;
  • (高级)分区优化:如果你使用的是分区表,重写器会找到实际使用的分区;
  • (高级)物化视图重写:如果有物化视图匹配查询的子集,重写器会检查其是否是最新的,并用物化视图替换实际的表;
  • (高级)定制规则:如果你为了修改查询(像Oracle策略)定制了一些规则,重写器会执行这些规则;

重写后的查询会被转发给优化器继续处理。

【连载】关系型数据库是如何工作的?(11) - 查询管理器之重写

标签:

人气教程排行