本节简单介绍了PG查询优化表达式预处理中的规范化过程。规范化具体的做法一是忽略NULL以及OR中的False,And中的True(实现函数find_duplicate_ors),二是拉平谓词(实现函数:pull_ors/pull_ands),三是清除重复的ORs(实现函数process_duplicate_ors)。这些函数位于文件src/backend/optimizer/prep/prepqual.c中。规范化处理基于布尔/逻辑代数运算的相关基本定律:
幂等律
A∪A = A
A∩A = A
交换律
A∪B = B∪A
A∩B = B∩A
结合律
A∪(B∪) = (A∪B) ∪
A∩(B∩)免费云主机域名 = (A∩B)∩
吸收律
A∪(A∩B) = A
A∩(A∪B) = A
分配律
A∪(B∩)=(A∪B)∩(A∪)
A∩(B∪)=(A∩B)∪(A∩)
幺元律
0∪A = A
1∩A = A
1∪A = 1
0∩A = 0
补余律
A∪A’ = 1
A∩A’ = 0PG源码对规范化表达式的注释如下:忽略NULL以及OR中的False/AND中的TRUE
Where条件语句中的NULL/FALSE/TRUE,如能忽略,忽略之.如:NULL OR FALSE OR dwbh = ‘1001’,则忽略NULL/ FALSE拉平谓词
SQL语句中的X1 OR/AND (X2 OR/AND X3),拉平简化为OR/AND(X1,X2,X3)
X1 OR/AND (X2 OR/AND X3),在查询树中为树状结构,第一层节点是BoolExpr,该Node中的args链表有2个元素,args->1=X1,args->2=BoolExpr,args->2->1=X2,args->2->2=X3,组成树状结构.简化后args->1/2/3=X1/X2/X3,所有条件处于同一个层次上,并不是树状结构.清除重复ORs
清除重复ORs的数学基础是布尔(逻辑)代数:
(X1 AND X2) OR (X1 AND X3) 应用分配律可以改写为 X1 AND (X2 OR X3),这样改写的目的是把X1抽取出来,为后续下推谓词X1作准备.
如(dwbh = ‘1001’ AND dwbh = ‘1002’) OR (dwbh = ‘1001’ AND dwbh = ‘1003’)条件,会改写为dwbh = ‘1001’ AND (dwbh = ‘1002’ OR dwbh = ‘1003’)主函数入口:
subquery_plannerpreprocess_expressioncanonicalize_qualfind_duplicate_orsprocess_duplicate_orspull_orspull_ands测试脚本:该语句经规范化后与以下SQL语句无异:gdb跟踪:1、优化的数学基础:布尔代数以及相关的定律;
2、表达式规范化的过程:表达式扁平化处理以及公共谓词提取等的处理逻辑。布尔代数
prepqual.c
相关推荐: PostgreSQL 源码解读(205)- 查询#118(数据结构RangeTblEntry)
本节简单介绍了PostgreSQL在执行逻辑优化中对应Relation的数据结构:RangeTblEntry. RangeTblEntry RTE可能是普通表/FROM中的子查询/JOIN语句的结果等(只有显式的JOIN语法会产生RTE,由多个FROM项生成的…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。