【问题标题】:Nested Join vs Merge Join vs Hash Join in PostgreSQLPostgreSQL 中的嵌套连接、合并连接和散列连接
【发布时间】:2018-02-28 07:09:04
【问题描述】:

我知道了

  1. 嵌套连接
  2. 合并加入
  3. 哈希连接

作品及其功能。

我想知道这些连接在 Postgres 中是在什么情况下使用的

【问题讨论】:

标签: postgresql sql-execution-plan


【解决方案1】:

以下是一些经验法则:

  • 嵌套循环连接是首选,如果连接的一侧有很少的行。如果连接条件不使用相等运算符,则嵌套循环连接也用作唯一选项。

  • 哈希连接是首选如果连接条件使用相等运算符并且连接的两边都很大并且哈希适合work_mem

  • 合并连接如果连接条件使用相等运算符并且连接的两边都很大,但可以有效地根据连接条件排序(例如,如果有连接列中使用的表达式的索引)。

一个典型的 OLTP 查询只从一个表中选择一行,而从另一个表中选择关联的行,总是使用嵌套循环连接作为唯一有效的方法。

连接具有许多行的表(在连接之前无法过滤掉)的查询对于嵌套循环连接将非常低效,并且如果连接条件允许,将总是使用散列连接或合并连接它。

优化器会考虑这些连接策略中的每一个,并使用承诺成本最低的那个。此决定所基于的最重要因素是连接两侧的估计行数。因此,错误的优化器选择通常是由对行数的错误估计造成的。

【讨论】:

  • 这是连接条件中使用的列的索引。
  • 无法有效地根据连接条件进行排序。 - 你能解释一下关于那条线的简短说明吗?因为我混淆了合并和哈希
  • 如果生成的哈希表假定适合(或多或少)work_mem,并且其他方法假定,则首选IMO哈希连接成本更高。这通常会导致小表或新表被散列连接。
  • @wildplasser 我同意并相应地更改了答案。我的回答不是完整的解释,问题很笼统。
猜你喜欢
  • 2014-05-31
  • 2010-11-09
  • 2011-10-22
  • 2019-07-28
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
相关资源
最近更新 更多