JOIN表达式

JOIN表达式,也称为join,根据特定列值的条件(例如相等条件)组合两个或多个表的结果。连接是一种特殊的表表达式。

支持的类型

hubble支持以下连接类型:

  • 内连接
  • 左外连接
  • 右外连接
  • 全外连接

内连接

仅返回左右操作数中与条件匹配的行。

<table expr> [ INNER ] JOIN <table expr> ON <val expr>
<table expr> [ INNER ] JOIN <table expr> USING(<colname>, <colname>, ...)
<table expr> NATURAL [ INNER ] JOIN <table expr>
<table expr> CROSS JOIN <table expr>

左外连接

对于右侧没有匹配项的每个左侧行,NULL将返回右侧列的值。

<table expr> RIGHT [ OUTER ] JOIN <table expr> ON <val expr>
<table expr> RIGHT [ OUTER ] JOIN <table expr> USING(<colname>, <colname>, ...)
<table expr> NATURAL RIGHT [ OUTER ] JOIN <table expr>

右外连接

对于左侧没有匹配项的每个右侧行,NULL将返回左侧列的值。

<table expr> RIGHT [ OUTER ] JOIN <table expr> ON <val expr>
<table expr> RIGHT [ OUTER ] JOIN <table expr> USING(<colname>, <colname>, ...)
<table expr> NATURAL RIGHT [ OUTER ] JOIN <table expr>

全外连接

对于在另一侧没有匹配的连接一侧的每一行,NULL将为非匹配侧的列返回值。

<table expr> FULL [ OUTER ] JOIN <table expr> ON <val expr>
<table expr> FULL [ OUTER ] JOIN <table expr> USING(<colname>, <colname>, ...)
<table expr> NATURAL FULL [ OUTER ] JOIN <table expr>

join算法

hubble支持以下执行连接的算法:

  • 合并连接
  • 哈希连接
  • 查找连接
  • 反向连接

合并连接

要执行两个表的合并连接,两个表都必须在相等列上建立索引,并且任何索引都必须具有相同的顺序。

对两个表的索引列执行合并连接,如下所示:

  • hubble检查相等列上的索引,并检查它们的顺序是否相同。
  • hubble从每个表中取出一行并进行比较。

哈希连接

如果无法使用合并连接,hubble会使用散列连接。散列连接在计算需要额外的内存。

对两个表执行哈希连接,如下所示:

1.hubble读取两个表并尝试选择较小的表。 2.hubble在较小的表上创建一个内存中的哈希表。如果哈希表太大,它会溢出到磁盘存储(这会影响性能)。 3.hubble然后扫描大表,查找哈希表中的每一行。

查找连接

基于成本的优化器决定何时使用查找连接是有益的。当两个表之间的大小不平衡时使用查找连接,因为它只读取较小的表,然后在较大的表中查找匹配项。查找连接要求右侧(即更大的)表在连接条件中涉及的列上建立索引。只有当部分索引包含正在查找的行的子集时,才能使用部分索引。

查找连接在两个表上执行,如下所示:

1.hubble读取小表中的每一行。 2.hubble然后扫描(或查找)较大的表以查找与较小表的匹配项并输出匹配的行。

反向连接

反向连接强制优化器使用在连接右侧使用GIN索引的连接。INNER反向连接只能与LEFT连接一起使用。

<table expr> INNER INVERTED JOIN <table expr> ON <val expr>
<table expr>  LEFT INVERTED JOIN <table expr> ON <val expr>

LATERAL查询

LATERAL子查询是在在其语句中引用另一个查询或子查询的相关select子查询,通常在left joininner join的上下文中。与其他相关子查询不同,LATERAL子查询在引用查询中为内部子查询中的每一行迭代,就像for循环一样。

要创建LATERAL子查询,请直接在内部子查询SELECT语句之前使用LATERAL关键字。

select empno,ename from emp , LATERAL (select * from dept  d where d.deptno = emp.deptno and  deptno = '50');
 empno | ename
--------+---------
  7580 | WAL%ER

性能最佳实践

  • 外连接的处理效率通常低于内连接,尽可能使用内部联接。
  • 使用EXPLAIN确认连接的查询来验证是否使用了索引。
  • 使用索引实现更快的连接。