sql查询联接多个表-太慢

时间:2020-07-23 19:36:08

标签: sql performance join hive left-join

我目前正在尝试将几个表连接在一起(如果可能,可能还要再连接2个表),但是由于现在的查询方式,我什至看不到3个表的结果

select t1.x, 
t1.y,
t1.z,
t4.a,
t4.b,
t4.c,
t4.d
from  t1
left join t2 on t1.id=t2.id
left join t3 on t2.id=t3.id
left join t4 on t1.id2=t4.id
where t1.date between 'x' and'x'
and t1.city not in ('x')
and t3.column = x;

是否有一种方法可以优化此代码以使其运行得更快,并使其能够向其中添加更多表?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

您的查询存在一些逻辑问题,可能有助于提高速度。

t2具有相同的id值时,它们将加入到t1中。 然后,当且仅当在t2中存在一行并且与t1和t2具有相同的值时,t3才被拉入。 最后,在您的where子句中,t3.column必须为x,否则将被过滤。

这意味着t3中的行必须存在。每个没有t2记录和t3记录的t1记录都将在其中过滤掉。因此,您不需要左联接,而需要INNER联接。

select t1.x, 
t1.y,
t1.z,
t4.a,
t4.b,
t4.c,
t4.d
from  t1
inner join t2 on t1.id=t2.id
inner join t3 on t2.id=t3.id
left join t4 on t1.id2=t4.id
where t1.date between 'x' and'x'
and t1.city not in ('x')
and t3.column = x;

在某些DBMS中,您可以将t3.column子句移到join命令,这可以帮助过滤计划中较早的行。

select t1.x, 
t1.y,
t1.z,
t4.a,
t4.b,
t4.c,
t4.d
from  t1
inner join t2 on t1.id=t2.id
inner join t3 on t2.id=t3.id and t3.column = x
left join t4 on t1.id2=t4.id
where t1.date between 'x' and'x'
and t1.city not in ('x');

我最后的建议是仔细观察t2来确定您是否真的需要它。问问自己,为了得到正确的结果,在t2中必须存在一行吗? ...因为如果t1.id = t2.id,那么t1.id = t3.id,则可以完全消除t2表。