PostgreSQL代码分析,查询优化部分,pull_ands()和pull_ors()
2014-07-23 17:30
411 查看
PostgreSQL代码分析,查询优化部分。
这里把规范谓词表达式的部分就整理完了,阅读的顺序如下:
一、PostgreSQL代码分析,查询优化部分,canonicalize_qual
二、PostgreSQL代码分析,查询优化部分,pull_ands()和pull_ors()
三、PostgreSQL代码分析,查询优化部分,process_duplicate_ors
*************************************************************************************************************************************************************
pull_ands()和pull_ors()的代码比较便于理解,就是把树状结构的AND操作拉平,下图是pull_ands的例子,pull_ors逻辑相同:
张大明白的blog:http://blog.csdn.net/shujiezhang
这里把规范谓词表达式的部分就整理完了,阅读的顺序如下:
一、PostgreSQL代码分析,查询优化部分,canonicalize_qual
二、PostgreSQL代码分析,查询优化部分,pull_ands()和pull_ors()
三、PostgreSQL代码分析,查询优化部分,process_duplicate_ors
*************************************************************************************************************************************************************
pull_ands()和pull_ors()的代码比较便于理解,就是把树状结构的AND操作拉平,下图是pull_ands的例子,pull_ors逻辑相同:
/* * pull_ands * Recursively flatten nested AND clauses into a single and-clause list. * * Input is the arglist of an AND clause. * Returns the rebuilt arglist (note original list structure is not touched). */ static List * pull_ands(List *andlist) { List *out_list = NIL; ListCell *arg; foreach(arg, andlist) { Node *subexpr = (Node *) lfirst(arg); /* * Note: we can destructively concat the subexpression's arglist * because we know the recursive invocation of pull_ands will have * built a new arglist not shared with any other expr. Otherwise we'd * need a list_copy here. */ if (and_clause(subexpr)) out_list = list_concat(out_list, pull_ands(((BoolExpr *) subexpr)->args)); else out_list = lappend(out_list, subexpr); } return out_list; } /* * pull_ors * Recursively flatten nested OR clauses into a single or-clause list. * * Input is the arglist of an OR clause. * Returns the rebuilt arglist (note original list structure is not touched). */ static List * pull_ors(List *orlist) { List *out_list = NIL; ListCell *arg; foreach(arg, orlist) { Node *subexpr = (Node *) lfirst(arg); /* * Note: we can destructively concat the subexpression's arglist * because we know the recursive invocation of pull_ors will have * built a new arglist not shared with any other expr. Otherwise we'd * need a list_copy here. */ if (or_clause(subexpr)) out_list = list_concat(out_list, pull_ors(((BoolExpr *) subexpr)->args)); else out_list = lappend(out_list, subexpr); } return out_list; }
张大明白的blog:http://blog.csdn.net/shujiezhang
相关文章推荐
- PostgreSQL代码分析,查询优化部分,pull_ands()和pull_ors()
- PostgreSQL代码分析,查询优化部分,process_duplicate_ors
- PostgreSQL代码分析,查询优化部分,canonicalize_qual
- PostgreSQL代码分析,查询优化部分,canonicalize_qual
- 关系数据库查询优化分析
- “机器狗”病毒驱动部分逆向分析注释(C代码)
- [转]为 PHP 应用提速、提速、再提速!,第 2 部分: 分析 PHP 应用程序以查找、诊断和加速运行缓慢的代码
- Radmin的抓屏和显屏API代码部分分析
- 实例分析: 如何对比JIT优化前后的汇编代码
- 实例分析: 如何对比JIT优化前后的汇编代码
- PostgreSQL源码修改 ——查询优化(四)
- osworkflow基础入门部分汇总(基本概念,包用途分析及代码片断,表结构分析,主要优势,核心概念)
- mysql limit查询优化分析
- 运用 ADO.NET 对象优化数据查询代码
- 多条件查询代码优化
- sql语句的优化分析之一查询语句中左连接和函数效率分析比较
- 机器狗”病毒驱动部分逆向分析注释(C代码)
- 开始全面转向分析PostgreSQL代码
- 运用 ADO.NET 对象优化数据查询代码
- 数据库查询速度优化 1 建立索引(分析)