在数据库里RBO基于规则的优化一般指查询重写技术,按照一系列关系代数表达式的等价规则,对查询的关系代数表达式进行等价转换,从逻辑上减少执行的总量从而提高查询执行效率,例如,通过条件的推导得出非必要的表扫描、避免非必要的计算表示等。
查询重写RBO优化是非常重要的一种逻辑优化手段,通常应用和实施在查询优化过程的前端,将一些肯定能够优化的场景进行优化,RBO优化结束后进行物理优化,以下以常用的几种重写优化进行介绍:
Example 1:谓词化简优化Predicate Simplification
使用谓词查询条件的可满足性Satisfiability (SAT)&可传递性Transitive Closure(TC)对查询进行化简,a.w.k SAT-TC,假设有t1,t2表,他们的定义分别为:T1(c1 int, c2 int);,T2(c1 int, c2 int check (c2 < 30));,则原查询:
SELECT t1.c1,t1.c2, t2.c1, t2.c2FROM t1 JOIN t2 ON t1.c2 = t2.c2WHERE t1.c2 > 20
可优化为:
SELECT dt1.c1,dt1.c2, dt2.c1, dt2.c2FROM (select c1,c2 from t1 where t1.c2 between 20 and 30) as dt1,(select c1,c2 from t2 where t2.c2 between 20 and 30) as dt2WHERE dt1.c2 = dt2.c2;
说明:通过谓词逻辑可以发现当前查询中可以一次实施TC->SAT->TC
优化策略。
step1: TC优化:内连接关联条件t1.c2 = t2.c2 && t1.c2 > 20可以得出t2.c2 > 20
step2: SAT优化:t2.c2列上创建有check-constraint可以得出t2.c2 BETWEEN 20 AND 30
step3: TC优化:同理得出t1.c2 BETWEEN 20 AND 30
到此t1,t2在关联之前就可以最大限度减小处理的元组数,达到提升性能的目的,以下是其他SATTC例子:
A=B AND A=C --> B=CA=5 AND A=B --> B=5A=5 AND A IS NULL --> FALSEA=5 AND A IS NOT NULL --> A=5X > 1 AND Y > X --> Y >= 3X IN (1,2,3) AND Y=X --> Y IN (1,2,3)
Example 2:谓词下推优化Predicate Push Down
将谓词查询条件下沉到中间结果集的最底层提前过滤,可以有效减少读入到内存中数据的数量,减少计算层的代价
优化前:
SELECT MAX(total)FROM (SELECT product_key, product_name,SUM(quantity*amount) AS totalFROM Sales, ProductWHERE sales_product_key=product_keyGROUP BY product_key, product_name) AS vWHERE product_key IN (10, 20, 30);
优化后:
SELECT MAX(total)FROM (SELECT product_key, product_name,SUM(quantity*amount) AS totalFROM Sales, ProductWHERE sales_product_key=product_key AND product_key IN (10, 20, 30)GROUP BY product_key, product_name) AS vWHERE product_key IN (10, 20, 30);
说明:查询在优化前需要事先将中间结果集v计算出。
在计算的过程中需要对sales、product两张表的全量数据进行读取进行,然后对结果集进行Group分组、Aggregation聚合操作,但是最终的结果集只要求输出product_key的值为10,20,30的结果集。
利用谓词下推规则可以让product_key in(10,20,30)过滤操作在Join之前完成,如果查询条件product_key in(10,20,30)的选择率较低则可以减少Join、Aggregation、Group三个操作处理的数据量,从而提升性能。
Example 3:谓词上移优化Predicate Pullup
将谓词查询条件中比较繁重的函数计算放到最后,期望减小繁重计算的次数达到提升性能的目的。优化前:
SELECT *FROM t1,(SELECT * FROM t2WHERE complex_func(t2.c2) = 3) AS dt(c1,c2,c3)WHERE t1.c1 = t2.c1 AND t1.c2 > 30
优化后:
SELECT *FROM t1,(SELECT * FROM t2) AS dt(c1,c2,c3)WHERE t1.c1 = t2.c1 AND t1.c2 > 30 AND complex_func(t2.c2) = 3
说明:
原查询“complex_func(t2.c2) = 3”查询条件在子查询中,如果该条件在子查询DT中被计算则会导致t2表中的全量数据被计算开销较大。
通过谓词pullup上移到最外层让t2先和t1做关联和过滤,则能够有效减少complex_func被调用的次数,从而达到性能提升的目的。
查询重写是查询优化器阶主要分类之一,通常可以快速将处理的数据进行成倍数缩减,下图是常见的查询重写分类
标签:product,GaussDB,t2,t1,RBO,c2,c1,查询,重写 From: https://www.cnblogs.com/xiaoxu0211/p/18615346