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