繁体   English   中英

sql 查询连接多个表 - 太慢

[英]sql query joins multiple tables - too slow

我目前正在尝试将几个表连接在一起(如果可能的话,可能还会再加入 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;

有没有办法优化此代码以更快地运行并可能使其能够向其中添加更多表?

先感谢您!

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

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

这意味着 t3中必须存在一行。 每个没有 t2 记录和 t3 记录的 t1 记录都会被过滤掉。 因此你不需要左连接,你需要一个内部连接。

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 子句移动到连接命令中,这可以帮助过滤掉计划中较早的行。

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 表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM