【数据库内核】基于规则优化之条件化简

目录

概述

把HAVING条件并入WHERE条件

一、情况一

常量折叠

一、情况一

二、情况二

常量传播

一、情况一

等式变换

一、情况一

布尔表达式变换

一、情况一

总结

参考资料


概述

 

我们为什么要进行条件化简,条件化简的目的是什么?条件化简技术其实和谓词重写技术是相辅相成的都是为了能够更好的利用索引和降低CPU的计算量。使原先不能走索引的情况,改成可以通过索引优化。从而大大的提升了SQL的计算性能并且降低了SQL的执行时间。

 

把HAVING条件并入WHERE条件

 

一、情况一

SQL样式:

SELECT  C1 FROM  PUSH_HAVE2WHERE WHERE  C2 = 1 GROUP BY  C1 HAVING  C1 = 1;

优化后的样式:

C2 = 1 AND C1 = 1

Postgre SQL计划信息如下:

 

统一、集中化解条件子句,节约多次化解时间。

 

常量折叠

 

常量折叠,也即是对sql中的常量的加减乘除等操作进行预计算,避免执行过程频繁对常量重复执行加减乘除计算。

 

一、情况一

SQL样式:

SELECT  * FROM  CONST_FOLDING WHERE  C1 = 1 + 2 + 3 + 4 + 5;

优化后的样式:

C1 = 15

Postgre SQL计划信息如下:

 

 

二、情况二

SQL样式:

SELECT  * FROM  CONST_FOLDING WHERE  C1 = 1 + FLOOR(5);

优化后的样式:

C1 = 6

Postgre SQL计划信息如下:

 

 

常量传播

 

一、情况一

SQL样式:

SELECT  * FROM  CONSTANT_PROPAGATION WHERE  C1 = C2 AND C2 = 2;

优化后的样式:

C1 = 2 AND C2 = 2

Postgre SQL计划信息如下:

 

 

等式变换

 

一、情况一

SQL样式:

SELECT  * FROM  EXPR_TRANSFOR WHERE  C1 + 1 = 3

优化后的样式:

C1 = 2

如果C1列上面有索引,可以更高效的使用索引技术。

 

布尔表达式变换

 

一、情况一

SQL样式:

SELECT   * FROM   EXPR_TRANSWHERE  C1 > C2 AND C2 > 2

优化后的样式:

SELECT   * FROM   EXPR_TRANSWHERE  C1 > 2 AND C2 > 2 AND C1 > C2

经过上述优化, C1 > 2 AND C2 > 2 可以推到数据源上面去做,更好的利用了MAX/MIN索引技术。

 

总结

 

条件化简和谓词重写技术的的目的都很简单,就是为了减少计算量,减少了计算量提升了CPU的执行效率,从而提升了总体的时间。并且通过表达式谓词的改写,可以更好的使用索引,使之前没有办法走索引的情况,通过改写可以更好的应用索引的技术。

 

参考资料

1. 《数据库查询优化器的艺术》

 

分享大数据行业的一些前沿技术和手撕一些开源库的源代码
微信公众号名称:技术茶馆
微信公众号ID    :    Night_ZW
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值