【问题标题】:SQL (tsql) - joiningSQL (tsql) - 加入
【发布时间】:2014-11-18 03:20:31
【问题描述】:

我最近注意到,与一个接一个地执行这些连接相比,执行具有多个连接的查询需要更长的执行时间。具体来说:

SELECT a.*, b.A, c.A, d.A
 FROM a
 LEFT JOIN 
 b
 on a.A = b.A or a.B = b.A
 LEFT JOIN
 c
 on a.A = c.A or a.B = c.A 
 LEFT JOIN 
 d
 on a.A = d.A or a.B = d.A  

需要花费大量时间才能完成,而在执行连接的每个步骤并将其保存到表中时,只需要很短的时间。整个查询的工作时间大约为 1:30 并且尚未接近完成,而执行 (((a->b)->c)->d) 总共需要 3 分钟。

这是什么原因,有大神帮忙吗?

【问题讨论】:

  • 请编辑您的问题并更好地解释对您来说更快的选项。

标签: sql sql-server tsql join


【解决方案1】:

检查查询计划
我怀疑您正在进入循环连接
只要您有多个连接条件,它就会进行循环连接
试一试

SELECT a.*, b.A, c.A, d.A
  FROM a
  LEFT OUTER HASH JOIN b
    on a.A = b.A 
    or a.B = b.A
  LEFT OUTER HASH JOIN c
    on a.A = c.A 
    or a.B = c.A 
  LEFT OUTER HASH JOIN d
    on a.A = d.A 
    or a.B = d.A 

这可能有效 - 但我对此表示怀疑

SELECT a.*, b.A, c.A, d.A
  FROM a
  LEFT OUTER HASH JOIN b
    on b.A in (a.A, a.B) 
  ... 

【讨论】:

    【解决方案2】:

    问题一般不在于joins 的链接。问题是or。我建议这样写:

    SELECT a.*, coalesce(b1.A, b2.A) as A, coalesce(c1.A, c2.A), . . .
    FROM a LEFT JOIN 
         b1
         on a.A = b1.A LEFT JOIN
         b2
         on a.B = b2.A LEFT JOIN
         c1
         on a.A = c1.A LEFT JOIN
         c2
         on a.B = c2.A LEFT JOIN
         . . .
    

    如果您在每个表中最多有一个匹配项,这应该会返回相似的结果。如果or 中的每个条件在不同的行上匹配,您的版本可以生成多行。

    【讨论】:

      猜你喜欢
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      相关资源
      最近更新 更多