AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 937
Accepted
Andrew Bickerton
Andrew Bickerton
Asked: 2011-01-28 01:04:53 +0800 CST2011-01-28 01:04:53 +0800 CST 2011-01-28 01:04:53 +0800 CST

哈希,合并和循环连接之间的区别?

  • 772

在 SQL Server 中,您可以指定连接提示:

  • 哈希连接
  • 合并加入
  • 循环连接

这三个连接提示的定义是什么,应该在什么时候使用它们?

sql-server
  • 2 2 个回答
  • 61109 Views

2 个回答

  • Voted
  1. Best Answer
    Marian
    2011-01-28T01:11:28+08:002011-01-28T01:11:28+08:00

    来自 MSDN,在Advanced Query Tuning Concepts主题中:

    SQL Server 使用三种类型的连接操作:

    • 嵌套循环连接

    • 合并联接

    • 哈希连接

    如果一个连接输入很小(少于 10 行)而另一个连接输入相当大并且在其连接列上建立索引,则索引嵌套循环连接是最快的连接操作,因为它们需要最少的 I/O 和最少的比较。有关嵌套循环的更多信息,请参阅了解嵌套循环连接。

    如果两个连接输入不小但按连接列排序(例如,如果它们是通过扫描排序索引获得的),则合并连接是最快的连接操作。如果两个连接输入都很大并且两个输入的大小相似,则具有先验排序的合并连接和散列连接提供相似的性能。但是,如果两个输入大小彼此显着不同,散列连接操作通常要快得多。有关详细信息,请参阅了解合并联接。

    散列连接可以有效地处理大的、未排序的、非索引的输入。

    但我认为您应该从一个更基本的主题开始:查询调优,最后再使用查询提示。

    • 46
  2. Maria Ines Parnisari
    2020-04-27T14:15:37+08:002020-04-27T14:15:37+08:00

    这篇文章解释得很好:https ://www.linkedin.com/pulse/loop-hash-merge-join-types-eitan-blumin

    (假设N和M是正在连接的两个表中的行数)。

    嵌套循环连接

    • 复杂度:O(NlogM)
    • 通常在一张桌子非常小的时候使用
    • 较大的表有一个索引,允许使用连接键查找它

    合并加入

    • 复杂度:O(N+M)
    • 两个输入都按连接键排序
    • 使用相等运算符
    • 非常适合非常大的桌子

    哈希连接

    • 复杂性:O(N hc+M hm+J) 或 O(N+M) 如果忽略资源消耗成本
    • 最后的加入类型
    • 使用哈希表和动态哈希匹配函数来匹配行
    • 内存消耗和磁盘 I/O 利用率方面的成本更高。
    • 5

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve