本篇内容介绍了“PostgreSQL查询优化中对消除外连接的处理过程是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
使用的测试脚本:消除外连接的代码注释说明如下:有两种类型的外连接可以被消除,第一种是形如以下形式的语句:
SELECT … FROM a LEFT JOIN b ON (…) WHERE b.y = 42;
这种语句如满足条件可变换为内连接(INNER_JOIN).
之所以可以变换为内连接,那是因为这样的语句与内连接处理的结果是一样的,原因是在Nullable-Side端(需要填充NULL值的一端),存在过滤条件保证这一端不可能是NULL值,比如IS NOT NULL/y = 42这类强(strict)过滤条件.第二种形如:
SELECT … FROM a LEFT JOIN b ON (a.x = b.y) WHERE b.y IS NULL;
这种语句如满足条件可以变换为反半连接(ANTI-SEMIJOIN).
过滤条件已明确要求Nullable-Side端y IS NULL,如果连接条件是a.x = b.y这类严格(strict)的条件,那么这样的外连接与反半连接的结果是一样的.值得一提的是,在PG中,形如SELECT … 免费主机域名FROM a LEFT JOIN b ON (…) WHERE b.y = 42;这样的SQL语句,WHERE b.y = 42这类条件可以视为连接的上层过滤条件,在查询树中,Jointree->fromlist(元素类型为JoinExpr)与Jointree->quals处于同一层次,由于JoinExpr中的quals为同层条件,因此其上层即为Jointree->quals.有兴趣的可以查看日志输出查看Query查询树结构.消除外连接的代码在主函数subquery_planner中,通过调用reduce_outer_joins函数实现,代码片段如下:reduce_outer_joins相关的数据结构和依赖的子函数:
red免费主机域名uce_outer_joins_stateBitmapXXfind_nonnullable_rels外连接->内连接
测试脚本:gdb跟踪:外连接->反连接
测试脚本:gdb跟踪,与转换为内连接不同的地方在于reduce_outer_joins_pass2函数中find_forced_null_vars在这里是可以找到相应的Vars的:“PostgreSQL查询优化中对消除外连接的处理过程是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注云技术网站,小编将为大家输出更多高质量的实用文章!
相关推荐: 在部署Oracle11gR2执行root.sh脚本时遇到CRS-2101问题怎么办
这篇文章主要为大家展示了“在部署Oracle11gR2执行root.sh脚本时遇到CRS-2101问题怎么办”,内容简而易懂,条理清晰,希望能够帮助大免费主机域名家解决疑惑,下面让小编带领大家一起研究并学习一下“在部署Oracle11gR2执行root.sh脚…