NETEZZA:LEFT JOIN 能比 INNER JOIN 快吗?

Posted

技术标签:

【中文标题】NETEZZA:LEFT JOIN 能比 INNER JOIN 快吗?【英文标题】:NETEZZA: Can LEFT JOIN be faster than INNER JOIN? 【发布时间】:2016-10-24 08:32:18 【问题描述】:

查询:

SELECT * FROM TABLE1 TBL
INNER JOIN CROSS_REF_TABLE XREF
ON TBL.COL = XREF.COL

VS

SELECT * FROM TABLE1 TBL
LEFT JOIN CROSS_REF_TABLE XREF
ON TBL.COL = XREF.COL
WHERE XREF.COL IS NOT NULL

左连接能比内连接快吗?就我而言,出于某种原因,我看到 LEFT JOIN 更快。

注意:所有表格都是随机分布的。

当我查看执行计划时,两者之间的区别在于交叉引用表上添加的分布。

左连接:

Node 32.
  [SPU Sequential Scan table "CROSS_REF_TABLE XREF" as "XREF" ]
      -- Estimated Rows = 129044, Width = 18, Cost = 0.0 .. 0.2, Conf = 100.0
      Projections:
        1:XREF.ORG_SK  2:XREF.COL
  [SPU Distribute on (XREF.COL)]
  [HashIt for Join] 

内部连接:

Node 3.
  [SPU Sequential Scan table "CROSS_REF_TABLE XREF" as "XREF" ]
      -- Estimated Rows = 129044, Width = 18, Cost = 0.0 .. 0.4, Conf = 100.0
      Projections:
        1:XREF.ORG_SK  2:XREF.COL
  [HashIt for Join] 

Netezza LEFT JOIN 是做嵌套循环还是散列连接?

【问题讨论】:

肯定它选择的连接操作将基于估计的行数,而不是左连接或内连接的选择。 您问题中的两个查询是相同的,并且使用的是外连接 内连接和左连接返回两个不同的结果,主要问题应该是:我需要什么结果? 问题不在于结果是什么。我们可以通过在 where.c 语句中添加额外的条件来很好地实现我们想要的目标 问题类似***.com/questions/2726657/… 【参考方案1】:

虽然在某些情况下这可能是正确的,但标题中的陈述过于简单化,并表明仅存在有限相关性的因果关系。

如果您将主题更改为“在现实生活中是否会发生内连接和左连接在速度上不相等,即使它们的结果相同”,所有答案都是“是”

在 SQL 中有数百个这样的例子(= 与 >= AND

总是倾向于消除这些差异(并且通常会提高性能)的一件事是更新查询中涉及的所有表的统计信息,并限制大表与限制最终结果的 where 子句之间的连接数设置最多(避免雪花 - 坚持明星)

【讨论】:

以上是关于NETEZZA:LEFT JOIN 能比 INNER JOIN 快吗?的主要内容,如果未能解决你的问题,请参考以下文章

left outer join的on不起作用

sql语法:inner join on, left join on, right join on详细使用方法

Netezza 使用 JOIN 删除

NZSQL/代码 - Netezza NZ-SQL 中的 LEFT() 函数

JOIN 替代 SELECT 子查询

来自多个表的 Postgres/netezza 多重连接