Sql 在红移中执行反加入的最佳方法

Sql 在红移中执行反加入的最佳方法,sql,amazon-redshift,Sql,Amazon Redshift,反连接是一种在一个表中获取元组的方法,而元组在另一个表中不匹配 我们可以通过多种方式实现反连接: 相关子查询 不相关子查询 外部联接并检查是否为NULL 在红移中执行反连接的最佳方法是什么?在这种情况下,相关子查询不是最优的,红移的查询引擎不会将该查询解相关。如果没有实际的表布局和统计信息,以及实际的查询,很难给出明确的答案 我可以推测,这种任务需要红移端的HashJoin。如果其中一个表不是太大,并且两个表都有相同的dist键,那么可以在内存中高效地完成。带有空检查的外部连接听起来最合适,

反连接是一种在一个表中获取元组的方法,而元组在另一个表中不匹配

我们可以通过多种方式实现反连接:

  • 相关子查询
  • 不相关子查询
  • 外部联接并检查是否为NULL

在红移中执行反连接的最佳方法是什么?在这种情况下,相关子查询不是最优的,红移的查询引擎不会将该查询解相关。

如果没有实际的表布局和统计信息,以及实际的查询,很难给出明确的答案

我可以推测,这种任务需要红移端的HashJoin。如果其中一个表不是太大,并且两个表都有相同的dist键,那么可以在内存中高效地完成。带有空检查的外部连接听起来最合适,因为它是最可预测的-它可以做到这一点


但是实际性能将取决于许多因素,最好在有了表/查询后再回来。

如果没有实际的表布局和统计信息,以及实际的查询,很难给出明确的答案

我可以推测,这种任务需要红移端的HashJoin。如果其中一个表不是太大,并且两个表都有相同的dist键,那么可以在内存中高效地完成。带有空检查的外部连接听起来最合适,因为它是最可预测的-它可以做到这一点


但实际性能将取决于许多因素,最好在有了表/查询后再回来。

正如@denismo所说,没有上下文很难,但您可以尝试以下方法:

SELECT ...
FROM a LEFT OUTER JOIN b USING(key)
WHERE b.key is null

它将返回a中的行列表,这些行的键在a中不存在,正如@denismo所说,没有上下文很难,但您可以尝试以下方法:

SELECT ...
FROM a LEFT OUTER JOIN b USING(key)
WHERE b.key is null

它将返回a中的行列表,这些行的键在a中不存在

为什么不尝试它们并比较时间?我认为一般来说,在任何DBI中,外部联接都比子查询好得多,因为实际上没有红移实例。我只是在理论方面做工作。如果我们适当地设置dist键和sort键,连接速度会更快,这是有道理的。反连接似乎很常见,但RedShift明确指出它不支持相关的
子查询。为什么不尝试它们并比较时间?我认为一般来说,在任何DBI中,外部联接都比子查询好得多,因为实际上没有红移实例。我只是在理论方面做工作。如果我们适当地设置dist键和sort键,连接速度会更快,这是有道理的。反连接似乎很常见,但RedShift明确提到它不支持相关的
子查询不存在。