Merge Joins(PostgreSQL 14 Internals翻译版)

合并连接处理按连接键排序的数据集,并返回以类似方式排序的结果。输入集可以在索引扫描后预先排序;否则,执行者必须在实际合并开始之前对它们进行排序。

归并排序集

让我们看一个合并连接的例子;它在执行计划中由Merge Join节点表示:

在这里插入图片描述
优化器更喜欢这种连接方法,因为它返回排序的结果,如ORDER BY子句定义的那样。在选择计划时,优化器会注意数据集的排序顺序,除非确实需要,否则不会执行任何排序。例如,如果合并连接产生的数据集已经具有适当的排序顺序,则可以在随后的合并连接中使用:

在这里插入图片描述

首先要连接的表是机票和登机牌;它们都有一个复合主键(ticket_no,flight_id),结果按这两列排序。然后将生成的行集与票券表连接,票券表按ticket_no列排序。

连接只需要对两个数据集进行一次传递,并且不占用任何额外的内存。它使用两个指针指向内部集和外部集的当前行(最初是第一行)。

如果当前行的键不匹配,则其中一个指针(引用具有较小键的行)将向前移动到下一行,直到找到匹配。连接的行返回到上面的节点,并且内部集合的指针向前移动一位。操作将继续,直到其中一个集合结束。

该算法处理内部集合的副本,但外部集合也可以包含它们。因此,必须改进算法:如果在外部指针前进后键保持不变,则内部指针返回到第一个匹配行。因此,外部集合的每一行都将与具有相同键的内部集合的所有行相匹配。

对于外部连接,算法进一步调整了一点,但它仍然基于相同的原理。

合并连接条件只能使用相等操作符,这意味着只支持相等连接(尽管对其他条件类型的支持目前也在进行中)。

成本预估。 进一步查看刚刚的例子:

在这里插入图片描述
连接的启动成本至少包括所有子节点的启动成本。

通常,在找到第一个匹配之前,可能需要扫描外部或内部集合的一部分。可以通过比较(基于直方图)两个集合中最小的连接键来估计这个比例。但在这种特殊情况下,两个表中的票号范围是相同的。

总成本包括从子节点获取数据的成本和计算成本。

因为一旦其中一个集合结束,连接算法就会停止(当然,除非执行外部连接),所以可能只会部分扫描另一个集合。为了估计被扫描部件的尺寸,我们可以比较两个集合中的最大键值。在本例中,两个集合都将被完整读取,因此连接的总成本包括两个子节点的总成本之和。

此外,如果存在任何重复,则内部集合的某些行可能被扫描多次。估计的重复扫描次数等于连接结果的基数与内部集合的基数之差。在这个查询中,这些基数是相同的,这意味着集合不包含重复项。

该算法比较两个集合的连接键。一次比较的代价是在cpu_operator_cost值上估计的,而估计的比较次数可以看作是两个集合的行数之和(由重复引起的重复读取次数增加)。像往常一样,结果中包含的每一行的处理成本都是在cpu_tuple_cost值上估计的。

因此,在这个例子中,连接的成本估计如下:

在这里插入图片描述

并行模式

虽然合并连接没有并行特性,但它仍然可以在并行计划中使用。

外部集合可以由多个工作进程并行扫描,但内部集合总是由每个工作进程全部扫描。

由于并行散列连接几乎总是更便宜,我将关闭它一段时间:

在这里插入图片描述
下面是一个使用合并连接的并行计划的例子:

在这里插入图片描述
在并行计划中不允许完全和右外部合并连接。

修改

合并连接算法可用于任何类型的连接。唯一的限制是完整和右外部连接的连接条件必须包含合并兼容的表达式(“外列等于内列”或“列等于常量”)。内部连接和左外部连接只是根据不相关的条件过滤连接结果,但对于完全连接和右连接,这种过滤是不适用的。

下面是一个使用合并算法的全连接示例:

在这里插入图片描述

内部和左合并连接保留排序顺序。但是,完全外部连接和右外部连接不能保证这一点,因为NULL值可能会插入外部集的有序值之间,从而破坏排序顺序。为了恢复所需的顺序,规划器在这里引入Sort节点。自然地,它增加了计划的成本,使散列连接更有吸引力,所以计划器选择这个计划只是因为当前禁用了散列连接。

但是下一个示例不能没有散列连接:嵌套循环根本不允许完全连接,而由于不支持连接条件而不能使用合并。因此,无论enable_hashjoin参数值如何,都将使用散列连接:

在这里插入图片描述
让我们恢复之前禁用的哈希连接功能:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/115153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uni-app:多种方法写入图片路径

一、文件在前端文件夹中 1、相对路径引用 从当前文件所在位置开始寻找图片文件的路径。../../ 表示返回两级目录,即从当前文件所在的 wind.vue 所在的位置开始向上回退两级。接着,进入 static 目录,再进入 look 目录,最后定位到 …

uview1.0部分机型u-input组件禁用后无法触发click事件

最近,线上的一个 App 收到用户反馈,输入框禁用状态下点击无法拉起模态框。找了一下身边可用机型进行了测试,起初所有机型都没有复现这个问题,突然有一天 Redmi K30S Ultra 出现了异常,点击输入框无法触发点击事件&…

Oracle 数据库相关操作记录

1 数据库操作: 1.1 --调用存储过程: DECLARE P_DATA_DATE VARCHAR2(32767);--定义输入参数 P_O_RESULT VARCHAR2(32767); BEGIN P_DATA_DATE : 20220320;--输入日期 P_O_RESULT : NULL; TPS.PR_TP_RBC34_TMP ( P_DATA_DATE, P_O_RESULT );--输…

n皇后问题,不用递归

注释如下&#xff1a; class Solution:def totalNQueens(self, n: int) -> int:if n < 1: # 如果 n 小于 1&#xff0c;直接返回 0return 0count 0 # 初始化解的个数为 0stack [(0, set(), set(), set())] # 初始化一个栈&#xff0c;元素为当前处理的行数、已经放…

专业安卓实时投屏软件:极限投屏(QtScrcpy作者开发)使用说明

基本介绍 极限投屏是一款批量投屏管理安卓设备的软件&#xff0c;是QtScrcpy作者基于QtScrcpyCore开发&#xff0c;主要功能有&#xff1a; 设备投屏&控制&#xff1a;单个控制、批量控制分组管理wifi投屏adb shell快捷指令文件传输、apk安装 更多功能还在持续更新。 极…

Locust负载测试工具实操

本中介绍如何使用Locust为开发的服务/网站执行负载测试。 Locust 是一个开源负载测试工具&#xff0c;可以通过 Python 代码构造来定义用户行为&#xff0c;避免混乱的 UI 和臃肿的 XML 配置。 步骤 设置Locust。 在简单的 HTTP 服务上模拟基本负载测试。 准备条件 Python…

【限时免费】20天拿下华为OD笔试之 【单调栈】2023B-阿里巴巴找黄金宝箱(4)【欧弟算法】全网注释最详细分类最全的华为OD真题题解

【单调栈】2023B-阿里巴巴找黄金宝箱(4) 题目描述与示例 一贫如洗的椎夫阿里巴巴在去砍柴的路上&#xff0c;无意中发现了强盗集团的藏宝地&#xff0c;藏宝地有编号从 0-N 的子&#xff0c;每个箱子上面有一人数字&#xff0c;箱子排列成一个环&#xff0c;编号最大的箱子的…

远程监控高并发高吞吐java进程

文章目录 背景工具jconsole和jvisualvm 压测实战以太坊Java程序监控1.使用jconsole监控2.使用jvisualvm监控 问题分析堆内存使用异常通过调整内存策略来应对&#xff1a; 交易虚增问题 背景 作为使用java技术栈的金融类公司&#xff0c;确保Java程序在生产环境中的稳定性和性能…

2023年【北京市安全员-B证】考试试卷及北京市安全员-B证模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 北京市安全员-B证考试试卷考前必练&#xff01;安全生产模拟考试一点通每个月更新北京市安全员-B证模拟考试题题目及答案&#xff01;多做几遍&#xff0c;其实通过北京市安全员-B证在线考试很简单。 1、【多选题】《…

JVM(Java Virtual Machine)垃圾收集算法篇

前言 本文参考《深入理解Java虚拟机》&#xff0c;主要介绍GC相关的算法&#xff0c;引用计数法、可达性分析算法、垃圾收集算法&#xff08;分代收集理论&#xff0c;标记-清除/整理/复制&#xff09; 本系列其他文章链接&#xff1a; JVM&#xff08;Java Virtual Machine&…

leetcode 2525 根据规则将箱子分类 c++ pyhton java c题解

leetcode 2525 根据规则将箱子分类 题目 给你四个整数 length &#xff0c;width &#xff0c;height 和 mass &#xff0c;分别表示一个箱子的三个维度和质量&#xff0c;请你返回一个表示箱子 类别 的字符串。 如果满足以下条件&#xff0c;那么箱子是 “Bulky” 的&#…

macrodata数据集在Python统计建模和计量经济学中的应用

目录 一、数据介绍二、应用三、statsmodels 统计模块四、使用 statsmodels 统计模块分析 macrodata.csv 数据集参考 一、数据介绍 macrodata.csv是一个示例数据集&#xff0c;通常用于统计分析和计量经济学中的教育和训练目的。这个数据集通常包括以下列&#xff1a; year&am…

深度学习八股文: 模型训练全过程及各阶段的原因

深度学习模型的训练全过程通常包括以下步骤&#xff1a; 数据准备&#xff1a; 首先&#xff0c;需要准备用于训练的数据集。数据集应包含输入特征&#xff08;通常是数值或图像数据&#xff09;和相应的目标标签。数据通常需要被分为训练集、验证集和测试集&#xff0c;以便评…

STM32使用WWDG窗口看门狗

1 WWDG 介绍 1.1 WWDG 简介 窗口看门狗 WWDG 其实和独立看门狗类似&#xff0c;它是一个 7 位递减计数器不断的往下递减计数&#xff0c; 当减到一个固定值 0X40 时还不喂狗的话&#xff0c;产生一个 MCU 复位&#xff0c;这个值叫窗口的下限&#xff0c;是固定的值&#xf…

支持语音与视频即时通讯项目杂记(二)

目录 概念&#xff1a; 视频帧&#xff08;Video Frame&#xff09;是组成视频的基本单元。它可以被视为一幅静止的图像&#xff0c;它在一定的时间间隔内连续播放&#xff0c;从而形成了流畅的视频。 Changes to Qt Multimedia New features in Qt 6 Removed features C…

居民小区电动汽车有序充电策略研究

摘 要&#xff1a;针对电动汽车在居民小区无序充电对电网系统产生严重隐患及充电间时过长问题&#xff0c;提出一种采用延迟充电的电动汽车有序充电控制策略&#xff0c;并在分析国内外电动汽车有序充电的研究现状后&#xff0c;设计了居民小区电动汽车有序充电策略的总体框架。…

android利用FFmpeg进行视频转换

大致思路&#xff1a;首先安装FFmpeg库到windows电脑上&#xff0c;先测试命令行工具是否可以使用&#xff08;需要先配置环境&#xff09;&#xff0c;之后再集成到android程序中。 一些命令&#xff1a; 转化为流文件&#xff1a; ffmpeg -i input.mp4 -codec copy -bsf:v …

JIT耗时优化

优质博文&#xff1a;IT-BLOG-CN 一、背景 业务流量突增&#xff0c;机器直接接入大量流量QPS2000&#xff0c;JIT和GC会消耗太多CPU资源&#xff0c;导致1-2分钟时间内的请求超时导致异常&#xff0c;因此采用流量预热的方式&#xff0c;让机器逐步接入流量&#xff0c;需要预…

2023-10-20 游戏开发-cocos旧版本2.0.6-下载地址-记录

官方下载地址: Cocos Creator 下载 - 轻量高效的开发引擎 Tags cocos/cocos-engine GitHub cocos creater 旧版本: Tool/Package/REAMDE.md adofsauron/CocosCreatorFAQ - Gitee.com v2.0.6版本: Mac版&#xff1a;http://cocos2d-x.org/filedown/CocosStudioForMac-v2.0.…

vscode类似GitHub Copilot的插件推荐

由于GitHub Copilot前段时间学生认证的账号掉了很多&#xff0c;某宝激活也是价格翻了几倍&#xff0c;而却&#xff0c;拿来用一天就掉线&#xff0c;可以试试同类免费的插件哦。 例如&#xff1a;TabNine&#xff0c;下载插件后&#xff0c;他会提示你登录&#xff0c;直接登…