標籤:postgresql 最佳化 程式碼分析 閱讀
PostgreSQL程式碼分析,查詢最佳化部分。
這裡把正式指令動詞運算式的部分就整理完了,閱讀的順序如下:
一、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));elseout_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));elseout_list = lappend(out_list, subexpr);}return out_list;}
張大明白的blog:http://blog.csdn.net/shujiezhang
PostgreSQL程式碼分析,查詢最佳化部分,pull_ands()和pull_ors()