哪些可以免费做网站,什么是ui设计师,php可视化网站开发,手工艺品网站建设目的PgSQL内核机制 - 算子执行统计元组个数 我们在执行explain analyze观察执行计划执行情况时#xff0c;时常通过每个算子实际执行结果来分析SQL的执行#xff0c;其中有一项“rows XXX”表示执行的行数#xff08;这里姑且先认为是执行的真实行数#xff09;。但有些场景下… PgSQL内核机制 - 算子执行统计元组个数 我们在执行explain analyze观察执行计划执行情况时时常通过每个算子实际执行结果来分析SQL的执行其中有一项“rows XXX”表示执行的行数这里姑且先认为是执行的真实行数。但有些场景下比如MergeJoin如下 可以看到内表t1的SeqScan算子扫描出8行记录而排序Sort算子仅4个难道不是应该8个元组都进行排序吗 那我们得重新理解下rows这个字段的意义了。 1、merge join的操作 具体状态机可以参考PostgreSQL/GreenPlum Merge Inner Join解密 我们以文章开头的例子继续进行说明 1先取外表t2的1然后取内表1进行join条件判断 2两者相等标记内表位置1 3取内表下一个值2并保存到mj_InnerTupleSlot中外表值1和内表2进行比较1 2 4取外表下一个值2和标记位置1进行比较2 1则继续和内表当前保存的mj_InnerTupleSlot值进行比较 5两者相等标记内表位置2 6取内表下一个值3并将其保存到mj_InnerTupleSlot外表2和内表3比较2 3 7取外表下一个值3和内表标记位置2比较3 2继续和内表保存值mj_InnerTupleSlot比较3 3 8继续取内表下一个值4。外表3和内表4比较3 4 9外表值取完终止join 可以从流程中看到从内表只取出了4个值。这个正好和rows字段值匹配。也就是从子节点拿多少数据rows输出多大值。 我们从代码中查看下是否是这样。 2、rows统计 结构体Instrumentation中的tuplecount输出到explain analyze中进行展示如下图所示 ExecMergeJoin每次从内表即Sort节点取一个数据都会统计到Instr-tuplecount中。ExplainNode最终输出结果时将Instr-tuplecount统计到instr-ntuples中。最终的rows值为ntuples/nloops从执行计划中可以看到该算子仅进行了一次循环执行即nloops为1。所以可以这么理解从Sort节点取出多少值就会统计到rows中进行展示。 Rows的意义子节点向父节点输出元组的个数并不是子节点拥有的元组个数