【问题标题】:sql query joins multiple tables - too slowsql查询连接多个表 - 太慢了
【发布时间】:2020-11-13 15:07:52
【问题描述】:

我目前正在尝试将几个表连接在一起(如果可能的话,可能还会再加入 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:您应该指定您的 DBMS(oracle、mysql、sqlserver...)。 2:你应该发布你的表结构,包括索引。 3:您应该发布 EXPLAIN PLAN 的结果以供您查询。之后,我们将能够为您提供帮助。
  • 没有解释计划很难说,但是如果这些表很大并且与第一个表有多对多的关系,您可能希望在您之前使用临时表来仅存储相关数据和列做连接。我不确定 t2 和 t3 上的 left join 是否是故意的,但如果不是,您可以尝试使用 t2 和 t3 的 where exists,因为您并没有真正从这些表中提取任何列
  • 没有样本数据和更多解释,你的问题没有意义。它基本上说:“我有一些数据不会显示给你,还有一个查询不符合我的要求。”需要的是对您拥有的数据的解释以及对您想要做什么的解释。
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你的期望和原因。

标签: sql performance join hive left-join


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-22
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多