当前位置: 首页 > wzjs >正文

h5响应式网站技术唐山做网站优化

h5响应式网站技术,唐山做网站优化,专门做饥饿营销的网站,免费做效果图的网站有哪些nestloop流程 外层循环控制外表元组,内层循环控制内表元组。每对外表/内表元组都要先过ON条件,再过WHERE条件。支持参数化内表,outtertuple拿到后,把将外表的某些字段值传递给内表。支持LEFT JOIN/SEMI JOIN/ANTI JOIN等多种连接类…

nestloop流程

  1. 外层循环控制外表元组,内层循环控制内表元组。
  2. 每对外表/内表元组都要先过ON条件,再过WHERE条件。
  3. 支持参数化内表,outtertuple拿到后,把将外表的某些字段值传递给内表。
  4. 支持LEFT JOIN/SEMI JOIN/ANTI JOIN等多种连接类型。
  5. 通过InstrCountFiltered1/2统计被ON/WHERE条件过滤的元组数。
    • explain analyze中下面数据来源:
    • Rows Removed by Join Filter: 1234
    • Rows Removed by … Cond: 5678
  6. 每次返回一个符合条件的连接结果元组,直到所有外表元组处理完毕。

explain analyze打点位置:
在这里插入图片描述

1 nestloop流程简化

注意这套流程每次执行返回一条数据

ExecNestLoopfor (;;)if (需要新外表元组)取外表元组if (外表元组为空) return NULL处理参数,重扫内表取内表元组if (内表元组为空)标记需要新外表元组if (当前外表元组匹配了所有内标元组但没有匹配 && 是LEFT JOIN或ANTI JOIN)构造内表全NULL的连接结果if (通过WHERE条件)返回这个结果else统计被WHERE过滤if (ON连接条件通过)外表已匹配if (ANTI JOIN) 需要新外表,continueif (SEMI JOIN) 需要新外表if (WHERE通过) 返回否则计数else计数继续下一轮循环

2 nestloop源码分析

关键变量

  • NestLoopState *node:当前NestLoop节点的执行状态。
  • NestLoop *nl:计划树中的NestLoop节点。
  • PlanState *outerPlan, *innerPlan:外表和内表的执行节点。
  • TupleTableSlot *outerTupleSlot, *innerTupleSlot:外表和内表的当前元组。
  • ExprState *joinqual:连接条件(ON条件)。
  • ExprState *otherqual:其他条件(WHERE条件)。
  • ExprContext *econtext:表达式求值上下文。

源码:

static TupleTableSlot *
ExecNestLoop(PlanState *pstate)
{......for (;;){

获取外表元组,outer tuple

		if (node->nl_NeedNewOuter){outerTupleSlot = ExecProcNode(outerPlan);if (TupIsNull(outerTupleSlot)){// 外表没数据,结束。return NULL;}// 处理NestLoop参数foreach(lc, nl->nestParams){......

将外表的某些字段值传递给内表

				innerPlan->chgParam = bms_add_member(innerPlan->chgParam,paramno);}/** now rescan the inner plan*/

重新扫描内表

			ExecReScan(innerPlan);}

获取内表元组(inner tuple)

		innerTupleSlot = ExecProcNode(innerPlan);econtext->ecxt_innertuple = innerTupleSlot;

内表元组为空的处理

		if (TupIsNull(innerTupleSlot)){

需要新外表元组

			node->nl_NeedNewOuter = true;

处理LEFT JOIN/ANTI JOIN的特殊情况

到这里如果想进去,需要三个条件

  1. 外表这一行,内表循环了多次,但是没有一次能连接上的,nl_MatchedOuter保持false
  2. 连接是left join 或 anti join

这两中连接方式,在连不上的时候需要特殊处理下:

			if (!node->nl_MatchedOuter &&(node->js.jointype == JOIN_LEFT ||node->js.jointype == JOIN_ANTI)){

没有匹配的内表元组,生成一个全NULL的内表元组

				econtext->ecxt_innertuple = node->nl_NullInnerTupleSlot;

检查WHERE条件

				if (otherqual == NULL || ExecQual(otherqual, econtext)){

连上一条,

					return ExecProject(node->js.ps.ps_ProjInfo);}elseInstrCountFiltered2(node, 1);}continue;}

内外表元组都不为空,判断连接条件

		if (ExecQual(joinqual, econtext)){node->nl_MatchedOuter = true;

ANTI JOIN特殊处理:匹配到就不返回

			if (node->js.jointype == JOIN_ANTI){node->nl_NeedNewOuter = true;continue;}

SEMI JOIN(single_match)只要第一个匹配

			if (node->js.single_match)node->nl_NeedNewOuter = true;

检查WHERE条件,满足即可返回

			if (otherqual == NULL || ExecQual(otherqual, econtext)){return ExecProject(node->js.ps.ps_ProjInfo);}else

计数,被WHERE条件过滤

				InstrCountFiltered2(node, 1);}else

计数,被ON连接条件过滤

			InstrCountFiltered1(node, 1);// 每次循环结束,重置表达式上下文,释放内存ResetExprContext(econtext);}
}

3 explain analyze记录逻辑

惯用法:

InstrStartNode
执行算子
InstrStopNode

源码:

void
InstrStartNode(Instrumentation *instr)
{...

记录启动时间

	INSTR_TIME_SET_CURRENT_LAZY(instr->starttime); 记录启动时间...
}/* Exit from a plan node */
void
InstrStopNode(Instrumentation *instr, double nTuples)
{double		save_tuplecount = instr->tuplecount;instr_time	endtime;/* count the returned tuples */instr->tuplecount += nTuples;

记录本次算子执行时间

	if (instr->need_timer){INSTR_TIME_IS_ZERO(instr->starttime);INSTR_TIME_SET_CURRENT(endtime);INSTR_TIME_ACCUM_DIFF(instr->counter, endtime, instr->starttime);INSTR_TIME_SET_ZERO(instr->starttime);}...if (!instr->running){instr->running = true;

记录第一次算子执行完的时间,无论算子是否返回数据

		instr->firsttuple = INSTR_TIME_GET_DOUBLE(instr->counter);}else{if (instr->async_mode && save_tuplecount < 1.0)instr->firsttuple = INSTR_TIME_GET_DOUBLE(instr->counter);}
}
http://www.dtcms.com/wzjs/558478.html

相关文章:

  • 建设大学网站服务兼职做网站编辑
  • 小说网站的里面的搜索是怎么做的网站页面设计怎么收费
  • 如何做网站公司怎么做网络销售的网站
  • 烟台免费网站建设app展示网站模板
  • wap网页开发wordpress优化提速
  • jsp网站设计网站批量修改
  • 朝阳网站设计深圳最新新闻事件
  • 怎么学好网站建设给人做网站多少钱
  • 软件免费下载网站有哪些设计公司网站设计报价明细表
  • 上传网站视频要怎么做才清楚wordpress分类信息插件
  • 免费查公司的网站hao123浏览器官方下载
  • 杭州网站建设seo优化wordpress 文章评分插件
  • 医院网站建设建议虚拟主机wordpress安装教程
  • 如何做自己的业务网站办公空间设计案例平面图
  • 怎样做能让招聘网站记住密码网页微信版官网登录怎么弄到桌面
  • wordpress手机 apk湖南seo优化哪家好
  • 佛山网站建设专业现状咨询app开发制作公司
  • 网站建设图片怎么动怎么注册网址免费
  • 教育类型网站绵阳观察怎么登录不上
  • 男男做爰视频网站常州seo网络推广
  • 什么软件可以攻击网站建设网站需要先构建好模型
  • 所有外包网站今晚现场直播
  • 台州企业网站seo建网站的企业
  • 网站做产品的审核工作怎么样ui网页设计规则
  • 开发商虚假宣传可以退房吗seo网站免费优化软件
  • 可以接单做网站的软件中国建筑工程总公司招聘
  • 成都程序员网站idea制作网站
  • gom传奇网站建设聊城网站建设公司电话
  • 网站建设与维护制作网页做seo网站推广价格
  • 网站的ui规范公众号开发者密码是什么