SQL 術語:Join 中的 Build 和 Probe 是什么意思?

《大數據平臺架構與原型實現:數據中臺建設實戰》博主歷時三年精心創作的《大數據平臺架構與原型實現:數據中臺建設實戰》一書現已由知名IT圖書品牌電子工業出版社博文視點出版發行,點擊《重磅推薦:建大數據平臺太難了!給我發個工程原型吧!》了解圖書詳情,京東購書鏈接:https://item.jd.com/12677623.html,掃描左側二維碼進入京東手機購書頁面。

我們可能在一些介紹數據庫 Join 檔中看到 Build 和 Probe,分別代表著 Join 操作中的 右表 和 左表,為什么會有這樣的稱呼呢?原來它們都出自于一種叫 ”Hash Join“ 的 join 算法(常見的 Join 算法有:Hash Join、Loop Join、Merge Join)。先看一下名詞解釋:

  • Hash Join:一種實現 Join 的算法,它通過在 Join 的一側構建 Hash Table 并在另一側不斷匹配 Hash Table 來得到 Join 的結果。

  • Build Side (構建端 / 右表):Hash Join 中用于構建 Hash Table 的一側,稱為 Build Side。多數引擎默認以 Join 的右表作為 Build Side。

  • Probe Side(探查端 / 左表):Hash Join 中用于不斷匹配 Hash Table 的一側,稱為 Probe Side。多數引擎默認以 Join 的左表作為 Probe Side。

下面,簡答介紹一下 Hash Join 的原理,我們基于 Hash join in MySQL 8 一文給出的解釋展開,講解使用的 SQL 示例為:

SELECTgiven_name, country_name
FROMpersons JOIN countries ON persons.country_id = countries.country_id;

Hash Join 的實現分為:構建和探查兩個階段,以下是詳細介紹。

Hash Join 原理:構建階段


在 Hash Join 算法下,當兩張表要 Join 時,SQL 引擎會在內存中創建一張哈希表,然后選擇將其中一張較小的表(按字節度量而不是行數)的數據加載到這張哈希表中,并以 Join 列的值作哈希的 Key。既然是要將表的數據加載到內存中,所以,不難理解算法為什么要選擇加載小表而不是大表。

在上面的 SQL 示例中,countries 表肯定是一張小表,所以它會被加載到內存的哈希表中,也就是成為 Build Side,而 Join 列 country_id的值經 hash 后的值會作為哈希表中 Key。

? 至于為什么現在都將右表稱為 Build Side,左表稱為 Probe Side,我并沒有找到比較主流的有說服力的觀點,可能是因為算法在最初提出時就是這樣約定的:選擇右表作 Build Side, 左表作 Probe Side,后來隨著 SQL 引擎的優化,雖然能自動選擇小表作為 Build Side 了,但這種稱謂習慣被保留了下來。歡迎了解其中原委的讀者補充

下圖形象地展示了構建階段的工作原理:

img

Hash Join 原理:探查階段


構建階段完成后,SQL 引擎就從 探測端 逐行讀取記錄,然后用 Join 列的 Hash 值去內存中的哈希表中查找是否有對應記錄,有就是匹配到了 構建端 的記錄,然后聯合兩端的數據作為結果輸出。

同樣以上面的示例 SQL 為例,SQL 引擎逐行讀取 persons 表中的記錄,取出它的 country_id 列進行 hash 處理,以得到的哈希值為 Key 去哈希表中查找,找同相同哈希值的記錄就意味著和 countries 表中的一條記錄 Join 上了。

下圖展示了探查階段的工作原理:

img

不過,上圖并不算好,沒有把“探查”動作描述出來,下圖相對更加形象一些:

Figure 1: Build and probe sides of the Hash Join algorithm.

Hash Join 的限制

最后,提醒一下 Hash Join 的限制,其實從上面的原理介紹中你大概能推測出來:由于 Hash Join 是使用 join 列的哈希值進行匹配的,所以,關聯條件中必須包含至少一個 equi join(=)



參考資料:

https://www.zhihu.com/question/35906621

https://dev.mysql.com/blog-archive/hash-join-in-mysql-8/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716039.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716039.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716039.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何在Vue中實現事件處理?

Vue是一種流行的JavaScript框架,廣泛應用于前端開發。在Vue中,事件處理是一個非常關鍵的概念,可以幫助我們實現用戶與頁面的交互,今天我們就來探討一下如何在Vue中實現事件處理。 首先,讓我們先了解一下在Vue中如何綁…

[pdf]《軟件方法》強化自測題業務建模需求分析共191頁,230題

潘加宇《軟件方法》強化自測題業務建模需求分析共191頁,230題,已上傳CSDN資源。 在完成書中自測題基礎上,進一步強化。 也可到以下地址下載: 資料http://www.umlchina.com/url/quizad.html 如果需要網盤提取碼:uml…

【Python】1. 背景知識

認識 Python 計算機基礎概念 什么是計算機? 很多老一輩的人, 管下面這個叫做計算機. 然鵝, 它只是 “計算器”, 和計算機是有很大區別的. 現在我們所說的計算機, 不光能進行算術運算, 還能進行邏輯判斷, 數據存儲, 網絡通信等等功能,。 以至于可以自動的完成非常復雜的工作…

代碼隨想錄day10(2)字符串:反轉字符串Ⅱ (leetcode541)

題目要求:給定一個字符串 s 和一個整數 k,從字符串開頭算起, 每計數至 2k 個字符,就反轉這 2k 個字符中的前 k 個字符。如果剩余字符少于 k 個,則將剩余字符全部反轉。如果剩余字符小于 2k 但大于或等于 k 個,則反轉前…

Spring與Spring Boot:簡化Java開發的革命性框架

Spring與Spring Boot:簡化Java開發的革命性框架 摘要:本文將深入探討Spring與Spring Boot兩個在Java開發領域具有重要地位的框架。我們將了解它們的核心概念、區別、聯系以及在實際項目中的應用。通過本文,您將更好地理解如何使用這兩個框架…

Zookeeper4:Java客戶端、應用場景以及實現、第三方客戶端curator工具包

文章目錄 Java連接Zookeeper服務端依賴代碼使用 應用場景統一命名服務統一配置管理統一集群管理服務器節點動態上下線理解實現模擬服務提供者【客戶端代碼】-注冊服務模擬服務消費者【客戶端代碼】-獲取服務信息進行請求消費 軟負載均衡分布式鎖理解實現 生產集群安裝N臺機器合…

Java中的Collection

Collection Collection 集合概述和使用 Collection集合概述 是單例集合的頂層接口,它表示一組對象,這些對象也稱為Collection的元素 JDK 不提供此接口的任何直接實現.它提供更具體的子接口(如Set和List)實現 創建Collection集合的對象 多態的方式 具體的實現類ArrayList C…

leetcode - 71. Simplify Path

Description Given a string path, which is an absolute path (starting with a slash ‘/’) to a file or directory in a Unix-style file system, convert it to the simplified canonical path. In a Unix-style file system, a period ‘.’ refers to the current di…

MATLAB環境下基于熵的聲納圖像分割算法

聲納圖像作為準確獲取水下信息的重要途徑之一,在國防、軍事、工程等方面發揮著巨大作用。然而,由于水聲信道的復雜多變和聲波本身的傳播損失,聲納圖像往往呈現出分辨率和對比度不高、噪聲干擾嚴重、目標輪廓模糊等特點。 聲納圖像的分割指的…

FCIS 2023網絡安全創新大會:洞察前沿技術,探索安全新境界(附大會核心PPT下載)

隨著信息技術的飛速發展,網絡安全問題日益凸顯,成為全球關注的焦點。作為網絡安全領域的重要盛會,FCIS 2023網絡安全創新大會如期而至,匯聚了全球網絡安全領域的頂尖專家、學者、企業家和政策制定者,共同探討網絡安全的…

備戰藍橋杯————差分數組1

引言 一、差分數組 什么是差分數組 差分數組的作用 Java代碼實現差分數組 二、 區間加法 題目描述 代碼與解題思路 總結 引言 在數字世界的海洋中,數據是構建和優化算法的基石。然而,當我們面對需要頻繁進行區間操作的數組時,傳統的逐元素…

ABAP - SALV教程10 添加可編輯checkbox列

幾乎所有的功能報表都會有那么一個選擇列,問了業務顧問,業務顧問說是用戶不習慣使用報表原生的選擇模式。效果圖SALV的選擇列是通過將列設置成checkbox_hotspot樣式,注冊單擊事件完成勾選功能的。完成步驟 將SEL列設置成checkbox_hotspot樣式…

【筆記】OpenHarmony和HarmonyOS區別及應用開發簡介

一、概念 OpenHarmony(OH) : OpenAtom OpenHarmonyHarmonyOS(HO):開發 | 華為開發者聯盟 (huawei.com) HO當前最高是3.1,在華為mate 60上面也是。關于4.0、5.0和next這類版本說法都是面向用戶的,不是開發人員。對于程序員&#…

Springboot 項目讀取yaml的配置文件信息給靜態方法使用,以及通過配置 ResourceBundle 類讀取config.properties

讀取yaml 的配置文件 配置文件信息 iot_saas_tenement:user_id: 7........8d9bprivate_key: MII.......qQbj_url: http://4.....5:8088project_name: iot_s.......rojectdevice_name: te.....ice 創建一個類 ProxyProperties 讀取配置文件信息,并對外提供get方法 …

內存的檢測與排查

內存🐎的檢測與排查 文章目錄 內存🐎的檢測與排查查殺Java Web filter型內存馬0x01 內存馬簡歷史0x02 查殺思路0x03 內存馬的識別0x04 內存馬的查殺 查殺Java Web filter型內存馬 0x01 內存馬簡歷史 其實內存馬由來已久,早在17年n1nty師傅的…

QT6 libModbus 用于ModbusTcp客戶端讀寫服務端

雖然在以前的文章中多次描述過,那么本文使用開源庫libModbus,可得到更好的性能,也可移植到各種平臺。 性能:讀1次和寫1次約各用時2ms。 分別創建了讀和寫各1個連接指針,用于讀100個寄存器和寫100個寄存器,讀寫分離。 客戶端&am…

物聯網與智慧城市:科技驅動下的城市智能化升級之路

一、引言 隨著科技的不斷進步和城市化進程的加速,物聯網與智慧城市的結合已經成為推動城市智能化升級的關鍵力量。物聯網技術以其強大的連接和數據處理能力,為智慧城市的建設提供了無限可能。本文旨在探討物聯網如何助力智慧城市的構建,以及…

SLAM ORB-SLAM2(21)基礎矩陣的計算和評分

SLAM ORB-SLAM2(21)基礎矩陣的計算和評分 1. 前言2. 基礎矩陣2.1. 對級約束2.2. 推導2.3. 計算原理 3. ComputeF214. CheckFundamental 1. 前言 在 《SLAM ORB-SLAM2(20)查找基礎矩陣》 中了解到 查找基礎矩陣主要過程&#xff1…

web基礎03-JavaScript

目錄 一、JavaScript基礎 1.變量 2.輸出 3.變量提升 4.區塊 5.JavaScript數據類型 6.查看數值類型 7.undefined和null 8.布爾值 9.和的區別 10.算數/三元/比較/邏輯/賦值運算符 11.特殊字符 12.字符串 (1)獲取字符串長度 (2&am…

備戰藍橋杯Day21 - 堆排序的內置模塊+topk問題

一、內置模塊 在python中,堆排序已經設置好了內置模塊,不想自己寫的話可以使用內置模塊,真的很方便,但是堆排序算法的底層邏輯最好還是要了解并掌握一下的。 使用heapq模塊的heapify()函數將列表轉換為堆,然后使用he…