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 出现了异常,点击输入框无法触发点击事件&…

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

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

Locust负载测试工具实操

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

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

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

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

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

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

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

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

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

STM32使用WWDG窗口看门狗

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

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

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

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

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

JIT耗时优化

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

vscode类似GitHub Copilot的插件推荐

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

spring6-国际化:i18n | 数据校验:Validation

文章目录 1、国际化:i18n1.1、i18n概述1.2、Java国际化1.3、Spring6国际化1.3.1、MessageSource接口1.3.2、使用Spring6国际化 2、数据校验:Validation2.1、Spring Validation概述2.2、实验一:通过Validator接口实现2.3、实验二:B…

关于计算机找不到vcomp140.dll无法继续执行怎么修复

在计算机使用过程中,我们可能会遇到各种问题,其中之一就是vcomp140.dll文件丢失。vcomp140.dll是一个动态链接库文件,它通常用于支持软件运行和系统功能。当这个文件丢失时,可能会导致程序无法正常运行,甚至系统出现错…

分类预测 | MATLAB实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络数据分类预测

分类预测 | MATLAB实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络数据分类预测 目录 分类预测 | MATLAB实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现SSA-CNN-BiLSTM数据…

大厂秋招真题【贪心】大疆20230813秋招T1-矩形田地

题目描述与示例 题目描述 给定一个矩形田地,其高度为 h 且宽度为 w。同时,你将获得两个整数数组 horizontalCutting 和 verticalCutting,其中 horizontalCutting[i] 表示从矩形田地顶部到第 i 个水平切口的距离,verticalCutting…

使用CountdownLatch和线程池批量处理http请求,并处理响应数据

背景和问题 ​ 背景:最近项目的一个接口数据,需要去请求其他多个服务器的数据,然后统一返回; 问题点:如果遍历所有的服务器地址,然后串行请求就会出现请求时间过长,加入需要请求十个服务器&…

解决谷歌学术bib信息不全的问题

在我们撰写学术论文时,经常需要引用参考文献。如果用latex撰写论文,势必会用到文献的bib信息,大部分的教程都会告诉我们去google scholar上去搜索。 一、问题描述 搜索一篇文章,然后选择cite,再选择bib。 很明显&…

Node学习笔记之MySQL基本使用

使用 SQL 管理数据库 其实写接口简单来说就是操作数据库数据,所以我们需要学会数据库的增、删、查、改等基本操作 1. 什么是 SQL SQL(英文全称:Structured Query Language)是结构化查询语言,专门用来访问和处理数据…