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>
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
子查询是在在其语句中引用另一个查询或子查询的相关select
子查询,通常在left join
或inner 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
确认连接的查询来验证是否使用了索引。