目录
概述
我们为什么要进行条件化简,条件化简的目的是什么?条件化简技术其实和谓词重写技术是相辅相成的都是为了能够更好的利用索引和降低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_TRANS
WHERE
C1 > C2 AND C2 > 2
优化后的样式:
SELECT
*
FROM
EXPR_TRANS
WHERE
C1 > 2 AND C2 > 2 AND C1 > C2
经过上述优化, C1 > 2 AND C2 > 2 可以推到数据源上面去做,更好的利用了MAX/MIN索引技术。
总结
条件化简和谓词重写技术的的目的都很简单,就是为了减少计算量,减少了计算量提升了CPU的执行效率,从而提升了总体的时间。并且通过表达式谓词的改写,可以更好的使用索引,使之前没有办法走索引的情况,通过改写可以更好的应用索引的技术。
参考资料
1. 《数据库查询优化器的艺术》
![](https://img-blog.csdnimg.cn/2020090618421047.jpg)
微信公众号名称:技术茶馆
微信公众号ID : Night_ZW