PostgreSQL代码分析,查询优化部分,canonicalize_qual

PostgreSQL代码分析,查询优化部分。

张大明白的blog:http://blog.csdn.net/shujiezhang

相关博文:PostgreSQL代码分析,查询优化部分,process_duplicate_ors

/*
 * canonicalize_qual
 *	  Convert a qualification expression to the most useful form.
 *
 * The name of this routine is a holdover from a time when it would try to
 * force the expression into canonical AND-of-ORs or OR-of-ANDs form.
 * Eventually, we recognized that that had more theoretical purity than
 * actual usefulness, and so now the transformation doesn't involve any
 * notion of reaching a canonical form.
 *
 * NOTE: we assume the input has already been through eval_const_expressions
 * and therefore possesses AND/OR flatness.  Formerly this function included
 * its own flattening logic, but that requires a useless extra pass over the
 * tree.
 *
 * Returns the modified qualification.
 */
/*
 * 对WHERE语句或ON语句中的条件进行规范化,从集合的角度对AND和OR两个操作做合并分解。
 */
Expr *
canonicalize_qual(Expr *qual)
{
	Expr	   *newqual;

	/* Quick exit for empty qual */
	if (qual == NULL)
		return NULL;

	/*
	 * Pull up redundant subclauses in OR-of-AND trees.  We do this only
	 * within the top-level AND/OR structure; there's no point in looking
	 * deeper.
	 */
	/*
	 * 查找重复的OR操作,即化简条件语句。
	 * 假设WHERE条件为:
	 *			(A=1 AND B=1) OR (A=1 AND C=1)
	 * 可以化简为:
	 *			A=1 AND (B=1 OR C=1)
	 *
	 * 另外,这个函数中做了将树状的AND或OR语句平面化(flatten,或拉平)的工作,
	 * 这两个工作主要体现在pull_ands()和pull_ors()两个函数中。
	 */
	newqual = find_duplicate_ors(qual);

	return newqual;
}

/*
 * find_duplicate_ors
 *	  Given a qualification tree with the NOTs pushed down, search for
 *	  OR clauses to which the inverse OR distributive law might apply.
 *	  Only the top-level AND/OR structure is searched.
 *
 * Returns the modified qualification.	AND/OR flatness is preserved.
 */
static Expr *
find_duplicate_ors(Expr *qual)
{
	/*
	 * “分支一:or_clause”
	 *
	 * 如果WHERE表达式中的主操作是OR,例如是如下形式:
	 *			A=1 OR B=1 OR (C=1 AND D=1)
	 * 那么参数qual指针实际指向一个BoolExpr结构体。
typedef struct BoolExpr
{
	Expr		xpr; = 略
	BoolExprType boolop; = OR_EXPR,即对下面的3个进行OR操作
	List	   *args; = 3个,分别是A=1和 B=1和(C=1 AND D=1)
} BoolExpr;
	 *
	 * 这里的args是一个list,其中的3个元素的类型分别如下:
	 * 第一个是比较操作,类型是OpExpr
	 * 第二个是比较操作,类型是OpExpr
	 * 第三个是AND操作,是一个AND_EXPR类型的BoolExpr,递归调用时会处理
	 *
	 * 张大明白的blog:http://blog.csdn.net/shujiezhang
	 */
	if (or_clause((Node *) qual))
	{
		List	   *orlist = NIL;
		ListCell   *temp;

		/* Recurse */
		/*
		 * 对BoolExpr中的三个条件分别进行递归处理。
		 * 在这里需要重点关注上例中的AND_EXPR类型的BoolExpr,因为在递归调用中,他将
		 * 触发下一个分支(分支二)。
		 */
		foreach(temp, ((BoolExpr *) qual)->args)
			orlist = lappend(orlist, find_duplicate_ors(lfirst(temp)));

		/*
		 * Don't need pull_ors() since this routine will never introduce an OR
		 * where there wasn't one before.***这个原因没理解。***
		 */
		/* 详情见《PostgreSQL代码分析,查询优化部分,process_duplicate_ors》博文*/
		return process_duplicate_ors(orlist);
	}
	/*
	 * “分支二:and_clause”
	 *
	 *  这里主要做了两个操作:
	 *	1) 如果子语句中有OR类型的子语句,则递归调用find_duplicate_ors,因为 子OR语句中
	 *      或许也能提取公共项。
	 *	2) 对AND操作进行拉平。
	 */
	else if (and_clause((Node *) qual))
	{
		List	   *andlist = NIL;
		ListCell   *temp;

		/* Recurse */
		/*
		 * 子语句中存在一系列OR的情况。
		 * 例如对于:
		 *		A=1 AND ((B=1 AND C=1) OR (B=1 AND D=1))
		 * 这里的qual指针指向一个AND_EXPR类型的BoolExpr结构体,则
		 *
typedef struct BoolExpr
{
	Expr		xpr; = 略
	BoolExprType boolop; = AND_EXPR,即对下面的2个进行AND操作
	List	   *args; = 2个,分别是“A=1”和 “((B=1 AND C=1) OR (B=1 AND D=1))”
} BoolExpr;
		 *
		 * 对于其中的“((B=1 AND C=1) OR (B=1 AND D=1))”,在递归调用中,
		 * 会进入“分支一:or_clause”,进而转换为:
		 *		B=1 AND (C=1 OR D=1)
		 *
		 * 张大明白的blog:http://blog.csdn.net/shujiezhang
		 */
		foreach(temp, ((BoolExpr *) qual)->args)
			andlist = lappend(andlist, find_duplicate_ors(lfirst(temp)));

		/* Flatten any ANDs introduced just below here */
		/*
		 * 拉平。
		 *
		 * 因为主语句是AND类型,子语句也是AND类型,所以可以直接把子语句拉到父节点。
		 *
		 */
		andlist = pull_ands(andlist);
		/* The AND list can't get shorter, so result is always an AND */
		return make_andclause(andlist);
	}
	else
		return qual;
}

PostgreSQL代码分析,查询优化部分。

张大明白的blog:http://blog.csdn.net/shujiezhang

相关博文:PostgreSQL代码分析,查询优化部分,process_duplicate_ors

时间: 2024-08-06 11:24:23

PostgreSQL代码分析,查询优化部分,canonicalize_qual的相关文章

PostgreSQL代码分析,查询优化部分,pull_ands()和pull_ors()

PostgreSQL代码分析,查询优化部分. 这里把规范谓词表达式的部分就整理完了,阅读的顺序如下: 一.PostgreSQL代码分析,查询优化部分,canonicalize_qual 二.PostgreSQL代码分析,查询优化部分,pull_ands()和pull_ors() 三.PostgreSQL代码分析,查询优化部分,process_duplicate_ors ****************************************************************

PostgreSQL代码分析,查询优化部分,process_duplicate_ors

PostgreSQL代码分析,查询优化部分. /* * process_duplicate_ors * Given a list of exprs which are ORed together, try to apply * the inverse OR distributive law. * * Returns the resulting expression (could be an AND clause, an OR * clause, or maybe even a single su

静态代码分析工具sonarqube+sonar-runner的安装配置及使用

配置成功后的代码分析页面: 可以看到对复杂度.语法使用.重复度等等都做了分析,具体到了每一个方法和每一句代码. 四种使用方式: sonarqube + sonar-runner sonarqube + maven sonarqube + eclipse sonarqube + IDE IntelliJ 使用方式1 :sonarqube + sonar-runner 1.环境 jdk 1.7 sonarqube 4.5.7 (最新的sonarqube都要求jdk1.8,找了一个匹配1.7的较新版本

java代码分析及分析工具

java代码分析及分析工具 一个项目从搭建开始,开发的初期往往思路比较清晰,代码也比较清晰.随着时间的推移,业务越来越复杂.代码也就面临着耦合,冗余,甚至杂乱,到最后谁都不敢碰. 作为一个互联网电子商务网站的业务支撑系统,业务复杂不言而喻.从09年开始一直沿用到现在,中间代码经过了多少人的手,留下了多少的坑,已经记不清楚了,谁也说不清了. 代码的维护成本越来越高.代码已经急需做调整和改善.最近项目组专门设立了一个小组,利用业余时间做代码分析的工作,目标对核心代码进行分析并进行设计重构. 代码分析

Java静态代码分析工具Infer

Java静态代码分析工具Infer 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.Infer介绍 Infer是Facebook最新开源的静态程序分析工具,用于在发布移动应用之前对代码进行分析,找出潜在的问题.目前Facebook使用此工具分析Facebook的App,包括Android.iOS.Facebook Messenger和Instagram等. Facebook称该工具帮助其每个月检查出应用潜在的数百个Bug,例如一些空指针访问.资源

$*和[email protected]之间区别代码分析

#!/bin/bash set 'apple pie' pears peaches for i in $*           /*单引号被去掉,循环单个字符输出*/ do echo $i done [[email protected] Ex_14.02-14.31]# sh 14-14-1 apple pie pears peaches -------------------------------------------------------------- #!/bin/bash set

《linux 内核完全剖析》 keyboard.S 部分代码分析(key_map)

keyboard.S 部分代码分析(key_map) keyboard中间有这么一段,我一开始没看明白,究竟啥意思 key_map: .byte 0,27 .ascii "1234567890-=" .byte 127,9 .ascii "qwertyuiop[]" .byte 13,0 .ascii "asdfghjkl;'" .byte '`,0 .ascii "\\zxcvbnm,./" .byte 0,'*,0,32

20145234黄斐《网络对抗技术》实验四,恶意代码分析

恶意代码 概述 恶意代码是指故意编制或设置的.对网络或系统会产生威胁或潜在威胁的计算机代码.最常见的恶意代码有计算机病毒(简称病毒).特洛伊木马(简称木马).计算机蠕虫(简称蠕虫).后门.逻辑炸弹等. 特征: 恶意的目的,获取靶机权限.用户隐私等 本身是计算机程序,可以执行,并作用于靶机 通过执行发生作用,一般来说不运行是没问题的 恶意代码分析 在大多数情况下,进行恶意代码分析时,我们将只有恶意代码的可执行文件本身,而这些文件并不是我们人类可读的.为了了解这些文件的意义,你需要使用各种工具和技巧

20145326蔡馨熠《网络对抗》——恶意代码分析

20145326蔡馨熠<网络对抗>--恶意代码分析 1.实验后回答问题 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所以想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用什么方法来监控.. 需要监控什么? 系统中各种程序.文件的行为. 还需要注意是否会出现权限更改的行为. 注册表. 是否有可疑进程. 如果有网络连接的情况,需要注意这个过程中的IP地址与端口. 用什么来监控? 最先想到的肯定是使用wireshark抓包了,再进行进一步分析. Sysinternals