Sql 比较不同联接顺序的配置单元查询的效率

Sql 比较不同联接顺序的配置单元查询的效率,sql,join,hive,mapreduce,hiveql,Sql,Join,Hive,Mapreduce,Hiveql,考虑配置单元中的以下两个查询: SELECT * FROM A INNER JOIN B INNER JOIN C ON A.COL = B.COL AND A.COL = C.COL 及 问题:这两个查询在计算上是相同还是不同?换句话说,为了获得最快的结果,我应该选择写一个还是另一个,还是不重要?谢谢。在Hive 1.2上,也在Hive 2.3上进行了测试,都是在Tez上,优化器足够智能,可以推导表B的连接条件,并执行两个内部连接,每个连接条件都是

考虑配置单元中的以下两个查询:

SELECT
    *
FROM
    A
INNER JOIN 
    B
INNER JOIN
    C
ON 
    A.COL = B.COL
AND A.COL = C.COL


问题:这两个查询在计算上是相同还是不同?换句话说,为了获得最快的结果,我应该选择写一个还是另一个,还是不重要?谢谢。

在Hive 1.2上,也在Hive 2.3上进行了测试,都是在Tez上,优化器足够智能,可以推导表B的连接条件,并执行两个内部连接,每个连接条件都是正确的

检查简单查询

with A as (
select stack(3,1,2,3) as id
),
B as (
select stack(3,1,2,3) as id
),
C as (
select stack(3,1,2,3) as id
)

select * from A 
inner join B
inner join C
ON A.id = B.id AND A.id = C.id
Explain命令显示两个联接都作为映射联接在单个映射器上执行,并且每个联接都有自己的联接条件。这是解释输出:

地图1 文件输出运算符[FS_17] 映射联接运算符[MAPJOIN_27](行=1宽度=12) 条件:FIL_24.col0=RS_12.col0(内部)FIL_24.col0=RS_14.col0(内部),HybridGraceHashJoin:true,输出:[“U col0”,“U col1”,“U col2”]

首先,我认为它将在第一个查询中与表B交叉连接,然后与C连接将减少数据集,但由于优化器,两个查询的工作方式相同(相同的计划,相同的执行)

另外,我在关闭映射连接的情况下测试了相同的方法(
sethive.auto.convert.join=false;
),并且两个查询都得到了完全相同的计划。我没有测试过真正的大桌子,你最好仔细检查一下


因此,在Hive 1.2和Hive 2.3上,对于reducer上的map join和merge join,计算上都是相同的。

谢谢您的回答。@AbhishekParab使用子查询连接表,首先减少数据集,然后第二次连接将在更小的数据集上工作,可能更快。只有子查询可以帮助排序联接
with A as (
select stack(3,1,2,3) as id
),
B as (
select stack(3,1,2,3) as id
),
C as (
select stack(3,1,2,3) as id
)

select * from A 
inner join B
inner join C
ON A.id = B.id AND A.id = C.id