Terry Purcell 谈外连接(第二部分)

一次实时数据链路丢数排查:从 MQTT 队列积压到 SQL 统计开销 本文通过一次实时数据链路压测,排查了从MQTT到ClickHouse的端到端数据丢失问题。核心方法是为每条消息添加序号,建立独立观察点(MQTT订阅端、Kafka消费者),结合转发服务阶段统计与线程栈分析,定位到下游处理速度不足源于Druid SQL合并统计的高开销。优化措施包括关闭SQL合并、扩容代理队列、增强生产侧失败处理,并验证15分钟内实现全链路对账一致,显著缓解积压与丢包。关键收获:数据可对账、明确各阶段“成功”定义、关注客户端队列状态。 阅读详情

引言
这是我的专题中的第二部分,在该专题中我想让您更加容易地理解和使用 SQL 语言强大的外连接功能。

第一部分提供了内连接和外连接之间简单的比较,并且也介绍了在外连接操作中用来说明表的新术语。最终,我论述了不同的谓词类型以及在哪个阶段 DB2® 可以应用它们。

在这个部分,我将提供在替换 NULL(NULL-supplying)的表上编写谓词的背景、DB2 可以如何简化查询来改善性能以及要确保获得期望的结果所能采取的步骤。

左外连接和右外连接替换 NULL 的表谓词

  • 外连接简化
  • 保留 NULL
  • 连接前(before-join)谓词

外连接简化
回顾我在 第一部分中介绍的一些术语:

  • 保留行(preserved row)表是为连接操作中不匹配的行保留行的表。
  • 替换 NULL的表是为连接中不匹配的行提供 NULL 行的表。

 

然而,应用于保留行表的 WHERE 子句谓词的最重要的属性是 DB2 可以在连接之前或之后应用谓词;应用于替换 NULL 的表的 WHERE 子句谓词的效果却非常不同,因为如果该谓词抵消了由外连接引入的 NULL,那么它使 DB2 简化连接。

要说明我说的这些是什么意思,请参见 图 13,该图展示了引用替换 NULL 的表的 WHERE 子句谓词的示例。


左外连接 - 连接简化

对一个要限定的行,WHERE 子句谓词的计算值必须为 TRUE。如果在连接中出现不匹配的行,那么来自替换 NULL 的表的列是 NULL。当 DB2 将 WHERE 子句谓词 D.DEPTNAME NOT LIKE "%CENTER%" 与 NULL 进行比较时,其结果既不是 TRUE 也不是 FALSE,而是 UNKNOWN。因为该行的计算值不是 TRUE,所以不返回该行。因而,左外连接(left outer join)提供的 NULL 被 WHERE 子句谓词抵消了。这使 DB2 确定左外连接是不必要的,并使得查询被重写为一个内连接,该内连接可能是或者可能不是您在编写该查询时想要的。

DB2 将左外连接重写为内连接的好处是可以改善性能。应用到表 D 的谓词现在可以应用在连接之前(而不是之后),因为该谓词现在引用一个不替换 NULL 的表。保留行和替换 NULL 对于内连接是不相关的术语;假定在连接中将不返回不匹配行,即,所有表都是不替换 NULL 的。

保留 NULL
如果该外连接简化没有产生您想要的结果 - 即,您要求返回 NULL(或可选)行 - 那么使用 OR D.DEPTNAME IS NULL 来保留在答案集中的 NULL。

在 图 14中展示了这样的一个示例。


左外连接 - 保留 NULL

DB2 必须将 WHERE 子句谓词应用在连接之后,因为直到连接之后才知道行是匹配的(因而应用谓词的第一部分 - D.DEPTNAME NOT LIKE "%CENTER%" )还是不匹配的(因而应用谓词的第二部分 - OR D.DEPTNAME IS NULL )。

连接前谓词
如果您选择编写 WHERE 子句谓词,它被 DB2 在连接 之前应用到替换 NULL 的表上,那么会发生什么?

如果您这样做,那么没有 WHERE 子句谓词来限制保留行表上或最终结果中的行。您仅限制了来自替换 NULL 的表的行。 图 15展示了这样的结果。


替换 NULL 的表上的谓词

图 16展示如果您将连接前谓词重新编写为一个 ON 子句谓词,那么返回相同的结果。


替换 NULL 的表上的谓词 - 简化的

是在连接前还是连接过程中过滤来自替换 NULL 的表的行只是一个性能问题,DB2 根据所使用的连接方法来决定采用这两种方法中的哪一种。要产生正确的结果,两种方法都是有效的。因为行在连接中不匹配,所以在连接前除去该行不会影响输出。

DB2 可以(从 V6 开始)合并任何不必要的嵌套表表达式,例如替换 NULL 的表的嵌套表表达式( 图 15)被重写为单个查询块并被应用为连接中或连接前谓词( 图 16)。

全外连接替换 NULL 的表谓词

  • 外连接简化
  • 保留 NULL
  • 连接前谓词

外连接简化
适用于左外连接和右外连接(right outer join)的外连接简化的规则对全连接也是有效的。应用于替换 NULL 的表并使 NULL 被抵消的 WHERE 子句谓词使 DB2 简化连接。因为两个表都提供 NULL,所以不管该子句应用于哪个表,它都可以抵消 NULL。

图 17展示了 WHERE 子句谓词的一个示例,该 WHERE 子句谓词应用于全外连接(full outer join),它使 DB2 简化连接。


全外连接 - 连接简化

如果不使用连接简化,该谓词应用为完全连接后的(totally-after-join)谓词。假定优化器可以确定该谓词抵消 NULL,那么它可以将查询重写为左外连接。根据选择的表连接顺序,全外连接可以重写为左或右外连接。

将查询重写为左外连接意味着 WHERE 谓词现在可以应用为连接前谓词,使得连接的行更少了。如果 WHERE 子句谓词抵消了来自两个表的 NULL,那么简化使查询被重写为一个内连接。将该查询作为内连接执行允许两个表上的谓词在连接前被应用。

可以通过 explain(计划表)输出的 JOIN_TYPE 列来标识连接简化。值“l”表明该连接已经被简化为左外连接(因为没有运行时右外连接),而“空白”指示该连接简化为内连接。

保留 NULL
如果您要求在结果集中返回来自两个表的 NULL,那么请更改 WHERE 子句谓词以确保这些 NULL 不被除去。

图 18展示了 WHERE 子句谓词的一个示例,该 WHERE 子句谓词确实保留了 NULL。COALESCE 返回列表中第一个非 NULL 的值。从而该 WHERE 比较始终以一个实际的值为参照(除非该列定义为允许 NULL)。


全外连接 - 保留 NULL

在 图 18中展示的示例中,WHERE 子句谓词完全地在连接后应用,因为该 WHERE 谓词依赖于来自两个表的列。

还有更好的选择吗?

连接前谓词
通过编写查询来将这些谓词应用在连接前,您可以获得更好的性能(如 图 19所示)。


全外连接 - 保留 NULL 的另一个选择

当编写多个外连接时要小心

  • 丢失的行
  • 查找丢失的行

丢失的行
在 第一部分中,我提到当编写任何 SQL 语句时,主要着重于得到正确的结果。当有多个连接涉及到外连接时,很容易就“意外地”丢失基于连接谓词的来源的行。

当然,我已经说明对于不匹配的行,来自以 NULL 替换的表的列将是 NULL。如果来自以 NULL 替换的表的列在后继连接中被引用为连接谓词,那么 NULL 将永远不会满足等式,从而将不会进行更多的匹配。如果不询问数据,可能无法指出丢失了这些行,因为外连接简化可能不是 DB2 所必需的。外连接简化至少在计划表中是可以被识别的(基于 JOIN_TYPE 列)。

图 20展示一个在后继连接中使用的以 NULL 替换的列的示例。

多个外连接 - 丢失的行

step 1 应用连接前谓词。step 2 执行左外连接。在此示例中 department 和 employee 表的左外连接(step 2)不产生匹配行。从而,当执行 step 3 时(到 project 表的后继左外连接),以前连接的连接谓词的值是 NULL,因为它来自以 NULL 替换的表。然而,该行仍然被保留着,因为它是左外连接。而对于内连接,将不保留该行。

查找丢失的行
如果您确保后继的连接谓词始终引用来自保留行表的列,真实的值将对于后续的连接可用。确保在连接中返回正确的行是极其重要的一点。

图 21展示了一个示例,其中第二个连接引用来自保留行表的连接谓词。

多个外连接 - 查找丢失的行

在此示例中,我改正了前一个示例( 图 20)的错误。step 2(第一个左外连接)产生的数据包含来自保留行表的实际值“D01”。该值在 step 3(后继左外连接)中被用来与 project 表作比较,而不是 NULL。

此查询的连接顺序上的相关性要求首先访问 department 表。DB2 for z/OS™ 优化器(从 V6 开始)能够确定基于最低成本的剩余连接顺序,而不是编码顺序。突出显示为 step 2 和 step 3 的每个连接仅依赖于 department 表,而它们之间并不互相依赖。 

uboot引导vxworks--t2080调试记录 开发环境: t2080rdb, uboot2015, vxworks7.01. 《VxWorks_7_fsl_t2t4_BSP_Supplement_Guide__SR0620.pdf》描述: 实际上默认创建的vip,profile选项为none时,vip内核配置中是包含了INCLUDE_END选项的。所以在创建vip的时候最好就添加上PROFILE_DEVELOPMENT。 2. 内核参数bootargs是一些网络参数设置=> pri bootargs bootargs=memac(1,0)b109304 阅读详情

相关推荐

GD32F4系列Keil工程模板搭建全攻略(手把手教学版)

本文提供了一份详细的GD32F4系列Keil工程模板搭建指南。从软件安装、固件库获取、目录规划,到Keil工程创建、文件添加、关键配置(如编译器选项、头文件路径、时钟设置),再到代码定制与常见问题排查,手把手教你构建一个标准化、模块化的开发基础。文章重点介绍了如何利用官方固件库和代码模板,快速建立稳定高效的开发环境,适用于GD32F407等Cortex-M4内核芯片的入门与项目开发。

weixin_29159995的博客 429

Oracle复习 day3

day3: 1.多表查询 实质上是单表查询 多张表连接成一张表时会产生笛卡尔积 如何消除笛卡尔积:连接条件(放在where语句)如果有n张表的连接,至少需要n-1个连接条件才可以完全消除笛卡尔积? 连接方式: 1)等连接:连接条件使用=连接 常用主键的值等于外键的值 例一:查询所有员工的ID,名字,和所在部门的名称 步骤一:分析查询的表 s_emp,s_dept 步骤二:连接条件 s_emp.dept_id=s_dept.id; 步骤三:写sql语句 select s_emp.id,s_emp.last_n

m0_47073109的博客 408

软考-高级-信息系统项目管理第四版(完整24章全笔记)

包 括:信息系统、业务应用信息系统、信息安全系统、信息系统工程、业务应用信息系统工程和 信息安全系统工程等业务应用信息系统是支撑业务运营的计算机应用信息系统,信息安全系统工程是指为了达到建设好信息安全系统的特殊需要而组织实施的工程。项目经理由执行组织委派, 负责领导团队实现项目目标。①制定项目章程:②制订项目管理计划:③指导与管理项目工作:④管理项目知识:⑤监控项目工作:⑥实施整体变更控制:项目范围管理过程包括:规划范围管理;收集需求;定义范围;创 建WBS;确认范围;控制范围;

weixin_44934104的博客 3万+

SQL学习--Select(一)TOP、派生表、连接、谓词

TOP关键字 1 select top 4 WITH TIES t.title,sum(s.qty)as totalSales from sales s 2 left join titles t on s.title_id=t.title_id 3 group by t.title 4 order by totalSales View Code 这里的top 4 WITH ...

weixin_30920597的博客 425

【软件介绍】RVC本地部署使用方法

【摘要】RVC是一款功能强大的开源语音转换工具,具有实时处理、多音效选择、高质量音频处理等特点。文章详细介绍了RVC的安装与使用方法:1)配置Python环境;2)根据电脑系统选择对应安装包解压;3)启动程序进入浏览器操作界面。重点讲解了声音克隆的关键步骤:建议使用短音频素材,选择合适训练方法(推荐pm或rmvpe),设置100次训练轮数,生成的模型文件存入weights文件夹。最后通过上传音频即可实现声音克隆。操作过程需注意保持程序运行状态,并提供了相关资源下载地址。

心动的那一刻,记忆便盛开了花 2977

【脚本篇】---spyglass lint脚本

【代码】【脚本篇】---spyglass lint脚本。

冬瓜 6355

ORACLE 错误一览表(1)

ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: 会话附属于其它某些进程;无法转换会话 ORA-00022: 无效的会话 ID;访问被拒绝 ORA-00023: 会话引用进程私用内存;无法分离会话 ORA-00...

jianhai1229的博客 667

别再瞎试了!用Python+正交设计,5分钟搞定你的多因素实验方案

本文介绍了如何利用Python和正交设计高效优化多因素实验方案。正交设计通过精心设计的正交表,用最少的实验次数覆盖所有因素的水平组合,显著提升实验效率。文章详细讲解了正交设计的核心优势、Python实现工具链、实验实施与数据分析方法,以及高级技巧与常见问题解决方案,帮助读者快速掌握这一强大的实验优化技术。

weixin_42526087的博客 333

Oracle Database 11g SQL 开发指南学习笔记:从数据库中检索数据

--设置日期格式 alter session set nls_date_format = 'yyyy-mm-dd'; --1. --查询某些字段 select customer_id, first_name, last_name, dob, phone from customers; --查询所有列 sele

jinsuyan123的专栏 1105

【33】软考软件设计师——算法题(二):贪心法与回溯法深度精讲|第4题进阶满分攻略

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第33篇,承接第32篇分治法与动态规划,聚焦**下午第4题算法大题进阶核心**,详解贪心法与回溯法两大高频难点算法。全文超4000字深度拆解贪心法核心原理、贪心选择性质、局部最优推全局最优的底层逻辑,厘清贪心算法适用边界与经典误区;深挖回溯法深度优先遍历思想、递归回溯三步流程、可行性剪枝与最优性剪枝两大核心技巧;全覆盖活动选择、零钱兑换、01背包贪心禁区、八皇后、全排列等软考必考经典题型;配套标准化算法框架代码、考场填空模板、剪枝优化实操案例

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 439

R语言LASSO回归作图为什么X轴使用-log(λ)而不是log(λ),如何转化为log(λ)?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1015

Terry Purcell 谈外连接(第一部分)

Terry Purcell 是在澳大利亚堪培拉举行的 2001 IDUG 亚太地区会议的“Best Overall Speaker Award”的获奖者,他将在这篇文章(分两个部分)的第一部分中,就如何在外部连接中编写谓词提供一些建议。您在何处编写谓词?(第 1 部分)阅读第 2 部分 自 SQL 构造在 DB2 for OS/390® V6 中修订之后,如果我相信有一种 SQL 构造已

daniel112的专栏 977

智驾芯片&软件分层&测试

智能驾驶相关的芯片,软件分层,测试相关内容

天赐好车的博客 436

咨询专家Terry Purcell进行外部联接

存档日期:2019年5月14日 | 首次发布:2002年7月15日 特里·珀塞尔(Terry Purcell)回答了读者的一个问题,即有关将大表用于外部联接的问题。 此内容不再被更新或维护。 全文以PDF格式“按原样”提供。 随着技术的飞速发展,某些内容,步骤或插图可能已更改。 查看PDF文件 翻译自: https://www.ibm.com/developerworks/dat...

cusi77914的博客 128

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

SQL并行执行的机制解析与计划调控实践

并行执行是大数据量场景的核心提速手段,但用错代价极高。本文从问题边界讲起,梳理并行度的确定层级、优化器生成并行计划的逻辑、数据再分布与通信代价、倾斜成因与识别方法,覆盖表设计、索引策略、并行DML、RAC调度与参数取舍,配合三个真实失败案例与诊断步骤,给出一套可落地的并行治理流程与误区清单。

搞定过:百亿级数据、万级QPS、零宕机、AI工业化。 753

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Flink SQL 连接器实战:MySQL Source、Flink CDC 与 JDBC Sink 全解析

提供有界流读取,适合批处理和维表场景,简单直接但无法感知变更。MySQL CDC提供无界流读取,通过「全量快照 + binlog 增量」的方式实现实时捕获,是实时数仓的核心入口,但需要 MySQL 侧正确配置 binlog 和权限。JDBC Sink负责结果回写,关键在于区分仅插入流和更新流,更新流必须依赖主键完成 upsert。掌握这三者的差异,本质上就是掌握了 Flink 中「有界与无界」「追加与更新」这两组最基本的语义。

2401_83857914的博客 435

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

云数仓向PostgreSQL生态延伸的技术动因与工程代价

Snowflake以2.5亿美元收购Crunchy Data,把云数仓的触角伸向PostgreSQL生态。本文从负载补齐、元数据标准化与AI应用低延迟读写三个切面拆解收购动机,逐层分析列存与行存的能力边界、存算分离下引入事务负载的提交延迟预算、逻辑复制的接缝风险、元数据统一与混合负载隔离冲突,并给出迁移落地的分阶段验收清单与七个典型误区,最后提供评估厂商PostgreSQL能力的六项观察指标。

搞定过:百亿级数据、万级QPS、零宕机、AI工业化。 441

记一次Sql Server2012免费版如何升级到2016企业版本

本文记录了将SQL Server 2012免费版升级至企业版的完整流程,重点解决因版本限制导致无法使用代理功能的问题。通过加载ISO安装包,选择从旧版本升级,完成功能安装与实例配置后,需手动启用“代理XP”并检查服务状态。若代理仍异常,需通过安装程序添加“SQL Server代理”组件,最终实现企业版功能完整启用。

qq_57492774的博客 181

PostgreSQL 日报| OAuth 校验库置空仍可登录(11 月 9 日)

Tomas Vondra 提交了针对 commit a798660ebe3 中"bogus parameterizations"漏洞的清理版修复补丁,并为各个回退分支分别提供了对应的版本。据报道,OpenAI 正在进行新一轮融资,已额外筹集 110 亿美元,整轮融资尚未正式收官,预计将在未来数周内完成。作为一款面向现代开发流程的 Serverless Postgres 数据库,Lakebase 支持即时分支与环境克隆,并通过计算与存储分离的架构提升性能、降低成本、增强可靠性。函数中发现了一个 bug。

IvorySQL的博客 227

SQL Server 基础语法详解:从建库建表到约束与增删改查

本文以学生信息表 Students 为主线,系统讲解数据库基础语法,涵盖建库、建表、约束添加及增删改查操作。通过 SQL Server T-SQL 示例,清晰区分数据库、表结构与记录的操作对象,强调字段类型、非空、自增、主键、唯一、检查与默认约束的定义与应用,帮助读者理清各语句间的逻辑关系,掌握数据库管理的核心技能。

2601_96519735的博客 782

XSS 过滤器 vs SQL 注入防护:自动化测试平台中的

通过分析 AutoTest Platform 的源码可以看出,在实际开发中合理运用字符转义、参数化查询和白名单策略能够有效减少 Web 安全风险。对于非科班出身或刚刚入门的技术人员来说,理解这些安全措施的具体实现方式是非常重要的一步。建议读者可以尝试以下几个方向深入学习:1. 学习 Jsoup 库及 Whitelist API 的用法,并尝试自定义一套适用于自身项目的 HTML 清理规则;

后台模板 232

智能问数(Text2SQL)的两大方案及实施成本

现在流行挂个 RAG 知识库,把表结构、字段名、业务术语全向量化存起来,每次查询时现去检索相关片段喂给大模型。只做一件事,把口语化的自然语言转成有规则的自然语言,也就是“规范文本”。然后规则引擎根据预先配置好的业务词典和映射规则,把规范文本编译成 100% 准确的 SQL。核心工作量在配置业务词典,把用户爱说的“华北区”“在途订单”这些词,跟数据库表和字段对上。关键是,规则是写死的、确定的。SQL 怎么生成、逻辑怎么组合,全都写在规则里。出了问题,查规则、改词典、补映射,改完就知道对不对,没有不确定性。

Raqsoft 156

sqlsugar入门

sqlsugar入门

bjzhang75的博客 233

#SQLite 数据库笔记一:(概念 / 终端指令 / SQL 语句 / C 编程 / 回调函数)

数据库 = 数据的仓库,假设数据是海量。能力说明存储数据持久化保存,程序退出数据还在统计数据、分组、排序数据管理增、删、改、查(CRUD)嵌入式设备上也会用数据库(单片机网关、路由器、工业 HMI 都常见),因为 sqlite 体积小、无需服务进程、单文件即可。数据库 = 库 > 表 > 记录(行) > 字段(列)sqlite3 = 开源、C 写的、单文件、免安装、最多 2T 的嵌入式关系型数据库。

lwq20051110的博客 204
上一篇: Terry Purcell 谈外连接(第一部分)
下一篇: SQL进行排序、分组、统计
daniel112
博客等级 码龄21年 24粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值