加入类型的 Netezza

Posted

技术标签:

【中文标题】加入类型的 Netezza【英文标题】:Join types of Netezza 【发布时间】:2015-02-11 15:32:49 【问题描述】:

我无法在 Netezza/PureData 中获取正式的联接类型列表。

根据我读过的一个PowerPoint演示文稿,有5种类型:

    散列连接:需要等价条件、相同类型。最快 Exist Join:Hash Join 的一种? 表达式连接:也称为嵌套循环连接? 合并连接:它们是合并排序连接吗?一些文章提到类似于 Hash Joins 但用于浮点数 跨产品连接:慢?

如您所见,我有很多知识空白。不幸的是,我还没有找到涵盖该主题的全面文档。对此的任何意见将不胜感激。

【问题讨论】:

那些 IBM 用户可以自己制作标签吗? #puredata 已被占用。 @MaxN 您可以随时编辑 Q 并删除有问题的标签(我刚刚做了);当然这并不能解决根本问题 我希望你们知道,我们大多数 Netezza 用户将术语“PureData”与 Netezza 联系在一起,因为这些术语之间的联系已正式明确(ala www-01.ibm.com/software/data/puredata/analytics)。我们不参与你们关于使用该名称的“权利”的小争斗。否决建设性帖子并将其标记为“冒犯”您的标签是幼稚且不适合专业开发人员的行为。 【参考方案1】:

这是我的答案。我认为考虑它的最佳方式是考虑连接在 SQL 中是如何表达的,然后考虑数据库使用的连接算法来解决它们。


等值加入

这种形式的联接,其中联接条件是相等比较,每个项都是简单的列引用(即不是表达式)。

SELECT ...
FROM tableA a
   JOIN tableB b
   ON a.col1 = b.col

算法

Netezza 最常使用 Hash Join 方法解析 Equi-join,其中可以比较连接列的哈希值以验证相等性。

在某些情况下,Netezza 可能会使用 Merge Sort Join 方法,以防被连接的数据已经排序(例如使用物化视图),这使得这种通常昂贵的方法更具吸引力,或者当数据被比较的类型使得哈希比较不可靠(例如浮点数据类型)。


表达式连接

这种形式的联接,其中联接条件不是相等比较。

SELECT ...
FROM tableA a
   JOIN tableB b
   ON a.col1 < b.col

算法

由于简单的相等性评估是不够的,Netezza 使用 嵌套循环 方法处理这些情况。 tableA 中的每一行都针对 tableB 中的每一行单独评估。正是由于这个原因,表达式连接永远不能成为 Netezza 中的并置连接。因此,嵌套循环方法非常昂贵。


交叉连接

这种形式的联接,其中联接条件不包括至少一个表中的任何列。

SELECT ...
FROM tableA a
   JOIN tableB b
   ON a.col1 = 0

或 选择 ... 从表A a, 表B b

算法

Netezza 将采用 cartesion product 方法来解决这些问题,这可能会非常昂贵,并且也不能是 co-located join,因为每个数据切片中的每一行都必须连接到每个其他数据切片中的每一行。


隐含 IN/EXISTS 联接

诸如此类的语句在 SQL 中不是显式连接,但可以由数据库作为连接处理。

SELECT ...
FROM tableA a
WHERE col1 IN
   (
      SELECT col1
      FROM tableB
   )

SELECT ...
FROM tableA a
WHERE NOT EXISTS
   (
      SELECT *
      FROM tableB b
      WHERE a.col1 = b.col1
   )

算法

Netezza 将使用 Exists Join 方法来处理这些语句,这与 Hash Join 方法基本相同,但由于结果集中不需要连接数据,因此只需计算存在在这个过程中。

【讨论】:

IS NULL 和 IS NOT NULL 是否也被视为等值连接? 这些表达式测试一个值(或缺少一个值),但不比较列本身。它们可以添加到等连接而不中断等连接,但在计划文件中作为限制节点处理。 这是最有用的。谢谢。出于好奇,您是否来自 IBM Netezza? 顺便说一句,我请 IBM Netezza 的一位员工审核这篇文章。她的一个批评是,“ON a.col1 + 10 = b.col -3”的第二个 EXPRESSION JOIN 实际上是 HASH JOIN。而且,我仍然觉得这篇文章很有价值,因为你表达信息的方式更容易让我们吸收,而且你举了很好的例子。 啊,你/她说的很对。这将是一个哈希连接或合并排序连接,它不能是一个教练连接。我的脑袋也沉浸在搭配话题中,它渗透到了这里。我会删除它!

以上是关于加入类型的 Netezza的主要内容,如果未能解决你的问题,请参考以下文章

加入类型的 Netezza

在谷歌大查询中获得完全加入,在大查询中保持所有频率组合,让我只为所有类型的加入提供左加入

Android Room 加入的返回类型

通过批处理相同的类型从远程服务器加入模式

用户类型加入休眠

在 Python 中将具有不同类型的项目列表作为字符串加入