在工作中,常用到left join来关联其他hive表进行查询,并且每个表都有相应的where条件。
在数据量大的情况下,不同连接条件所在的位置对查询效率的影响还是很大的。下面举一些例子:
现在有三个表,它们分别是:
表一:user_info
字段名 类型 备注
imei bigint
type string
date string 分区列
表二:age_info
字段名 类型 备注
id bigint
age int
day string 分区列
表三:sex_info
字段名 类型 备注
id bigint
sex int
day string 分区列
以下sql代码:
select
t1.imei,
t1.type,
t2.age,
t3.sex
from user_info t1
left join age_info t2 on t1.imei = t2.id
left join sex_info t3 on t1.imei = t3.id
where t1.date = '2019-02-20'
and t2.day = '2019-02-20'
and t3.day = '2019-02-20'
优化sql,将where条件放到子查询中,查询效率将会提高很多。
select
t1.imei,
t1.type,
t2.age,
t3.sex
from
(select imei,type from user_info where date='2019-02-20') t1
left join (select age from age_info where day='2019-02-20') t2 on t1.imei = t2.id
left join (select sex from sex_info where day='2019-02-20') t3 on t1.imei = t3.id