”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > SQL 连接内部

SQL 连接内部

发布于2024-11-07
浏览:914

Inside SQL Joins

SQL 连接是查询数据库的基础,它允许用户根据指定条件组合多个表中的数据。连接分为两种主要类型:逻辑连接和物理连接。逻辑联接代表组合表中数据的概念方式,而物理联接是指这些联接在数据库系统(例如 RDS(关系数据库服务)或其他 SQL 服务器)中的实际实现。在今天的博文中,我们将揭开 SQL 连接的神秘面纱。

让我们开始吧!

逻辑连接

SQL中有多种类型的逻辑连接。最常见的两种是内连接和外连接。当我们需要从表中检索数据时,我们使用这些联接。

物理连接

物理连接在RDS内部实现。用户使用逻辑联接编写查询,RDS 使用物理联接来执行联接操作。有不同类型的物理连接,例如
1. 嵌套循环连接
2. 哈希连接
3. Merge Join等

嵌套循环连接

这是一种连接类型,其中选择记录较少的较小表并循环访问另一个表,直到找到匹配项。这种类型的联接在 MySQL、Postgres 甚至 SQL 服务器中都可用。但是,对于大型表来说,它不是一个可扩展的选项。主要用于连接运算符不使用相等的情况。

例如,地理空间查询:在处理地理数据时,您可能想要查找距其他点一定距离内的点。这可能涉及比较每个点组合之间的距离,这可以通过嵌套循环连接来实现。

SELECT *
FROM cities
JOIN landmarks ON distance(cities.location, landmarks.location) 



哈希连接

哈希联接是一种使用哈希表执行联接以查找匹配记录的方法。在内存中创建一个哈希表。如果数据量很大而没有足够的内存来存储它,则将其写入磁盘。哈希连接比嵌套循环连接更有效。在执行过程中,RDS 会构建内存中的哈希表,其中使用连接属性作为键来存储连接表中的行。执行后,服务器开始从另一个表中读取行,并从哈希表中找到相应的行。当连接运算符使用相等时,通常使用此方法。

假设您有一个“员工”表,其中包含 ID、姓名和部门 ID 等员工详细信息,以及一个“部门”表,其中包含 ID 和名称等部门详细信息。您想要连接这些表以获取每个员工所属的部门

SELECT *
FROM Employee
JOIN Department ON Employee.department_id = Department.department_id;

在此示例中,联接条件基于列之间的相等性,使其适合哈希联接。这种方法非常高效,尤其是在处理大型数据集时,因为它可以使用哈希表快速匹配记录。然而,与任何连接方法一样,重要的是要考虑数据集的大小和可用内存以确保最佳性能。

合并连接

Merge Join 是一种在 SQL 查询执行中使用的方法,当连接条件使用相等运算符且连接两边都很大时使用。该技术依赖于排序的数据输入。如果连接列中使用的表达式存在索引,则可以利用它来高效地获取排序后的数据。但是,如果服务器需要显式对数据进行排序,则分析索引并考虑优化它们以提高性能至关重要。

例子:
考虑一个场景,涉及包含销售交易的“销售”表,包括销售 ID、客户 ID 和销售金额,以及包含客户 ID、姓名和位置等客户详细信息的“客户”表。

SELECT *
FROM Sales
JOIN Customers ON Sales.customer_id = Customers.customer_id;

在这种情况下,“Sales”和“Customers”表都很重要,并且连接条件依赖于“customer_id”列的相等性。为了实现高效的合并联接,两个输入表都需要按联接列(“customer_id”)排序。如果“customer_id”列上没有现有索引,服务器可能需要执行额外的排序操作,这可能会影响性能。

要优化合并联接,建议在两个表中的“customer_id”列上创建或修改索引。确保正确维护和优化这些索引可以显着提高查询性能,特别是对于经常涉及基于“customer_id”列的联接的查询。

通过有效利用索引并确保数据输入排序,合并联接可以有效地处理具有基于相等联接条件的大型表之间的联接,有助于增强查询性能和整体系统效率。

方面 嵌套循环连接 哈希连接 合并连接
加入条件 不等式 平等 平等
输入数据大小 小型到中型 中型到大型 大的
数据排序 不需要 不需要 必需的
内存使用情况 低的 中到高 中到高
索引利用率 不是主要问题 有利 依赖于索引
性能(大数据集) 慢点 高效的 高效的
可扩展性 可扩展性较差 可扩展 可扩展
典型用例 中小型桌子 具有相等连接的大型表 具有相等连接的大型表
版本声明 本文转载于:https://dev.to/balajisasi/inside-sql-joins-5h6b?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-05-04
  • MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    在两个条件下插入或更新或更新 solution:的答案在于mysql的插入中...在重复键更新语法上。如果不存在匹配行或更新现有行,则此功能强大的功能可以通过插入新行来进行有效的数据操作。如果违反了唯一的密钥约束。实现所需的行为,该表必须具有唯一的键定义(在这种情况下为'名称'...
    编程 发布于2025-05-04
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-05-04
  • 人脸检测失败原因及解决方案:Error -215
    人脸检测失败原因及解决方案:Error -215
    错误处理:解决“ error:((-215)!empty()in Function Multultiscale中的“ openCV 要解决此问题,必须确保提供给HAAR CASCADE XML文件的路径有效。在提供的代码片段中,级联分类器装有硬编码路径,这可能对您的系统不准确。相反,OPENCV提...
    编程 发布于2025-05-04
  • 为什么尽管有效代码,为什么在PHP中捕获输入?
    为什么尽管有效代码,为什么在PHP中捕获输入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,输出...
    编程 发布于2025-05-04
  • 在Oracle SQL中如何提取下划线前的子字符串?
    在Oracle SQL中如何提取下划线前的子字符串?
    [ 在oracle sql 解决方案: Explanation:SUBSTR function extracts a substring starting from the specified position (0) and continuing for a specified length.IN...
    编程 发布于2025-05-04
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-05-04
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-05-04
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案: args)抛出异常{ 日历cal = calendar.getInstance(); SimpleDateFormat SDF =新的SimpleDateFormat(“...
    编程 发布于2025-05-04
  • 如何高效地在一个事务中插入数据到多个MySQL表?
    如何高效地在一个事务中插入数据到多个MySQL表?
    mySQL插入到多个表中,该数据可能会产生意外的结果。虽然似乎有多个查询可以解决问题,但将从用户表的自动信息ID与配置文件表的手动用户ID相关联提出了挑战。使用Transactions和last_insert_id() 插入用户(用户名,密码)值('test','test...
    编程 发布于2025-05-04
  • Python环境变量的访问与管理方法
    Python环境变量的访问与管理方法
    Accessing Environment Variables in PythonTo access environment variables in Python, utilize the os.environ object, which represents a mapping of envir...
    编程 发布于2025-05-04
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制,控制元素的滚动行为对于确保用户体验和可访问性是必不可少的。一种这样的方案涉及限制动态大小的父元素中元素的滚动范围。问题:考虑一个布局,其中我们具有与用户垂直滚动一起移动的可滚动地图div,同时与固定的固定sidebar保持一致。但是,地图的滚动无限期...
    编程 发布于2025-05-04
  • Python不会对超范围子串切片报错的原因
    Python不会对超范围子串切片报错的原因
    在python中用索引切片范围:二重性和空序列索引单个元素不同,该元素会引起错误,切片在序列的边界之外没有。这种行为源于索引和切片之间的基本差异。索引一个序列,例如“示例” [3],返回一个项目。但是,切片序列(例如“示例” [3:4])返回项目的子序列。索引不存在的元素时,例如“示例” [9] ...
    编程 发布于2025-05-04
  • Java为何无法创建泛型数组?
    Java为何无法创建泛型数组?
    通用阵列创建错误 arrayList [2]; JAVA报告了“通用数组创建”错误。为什么不允许这样做?答案:Create an Auxiliary Class:public static ArrayList<myObject>[] a = new ArrayList<myO...
    编程 发布于2025-05-04
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-05-04

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3