【问题标题】:SQL Statement with the same multiple subqueries running very slow具有相同多个子查询的 SQL 语句运行速度非常慢
【发布时间】:2022-01-09 09:55:33
【问题描述】:

我希望这里有人可以帮助我。我收到了这个需要很长时间才能运行的查询(超过 30 分钟)。我一直在尝试重写查询,但到目前为止没有运气。我发布了一个查询示例,以便您了解我正在尝试做什么。

Table1 有 2000 条记录。 Table2有2000000条记录。

Table2 可能不包含它正在尝试查找的记录。因此不能使用 CROSS APPLY 或 INNER JOIN。我认为这可以通过 LEFT JOIN 解决,但我一直无法找到重写它的方法。

SELECT
    ID, A, B,

    CASE WHEN c IS NULL then
        (SELECT max(distinct c) FROM TABLE2 tbl2 WHERE tbl1.Id = tbl2.Id)
    ELSE
        C
    END as C,

    CASE WHEN d IS NULL then
        (SELECT max(distinct d) FROM TABLE2 tbl2 WHERE tbl1.Id = tbl2.Id)
    ELSE
        D
    END as D,

    CASE WHEN e IS NULL then
        (SELECT max(distinct e) FROM TABLE2 tbl2 WHERE tbl1.Id = tbl2.Id)
    ELSE
        e
    END as e,
    f, g, h, i
FROM TABLE1 tbl1

除了运行 'select max' 查询 3 次之外,有没有办法只加入表一次,这样“相同”的查询就不会运行 3 次? Max 的原因是 Table2 可能包含多个具有相同 Id 的记录。在这种情况下,将 Id 视为具有多个订单行号的 Order_Id。 希望有道理。

【问题讨论】:

  • OUTER APPLY 似乎是您想要的。尽管没有任何迹象表明这是您的性能问题的原因。确实,您需要检查执行计划并确定使用时间的位置。
  • 尝试在table2 (id ASC, e DESC)上建立索引。
  • 请通过brentozar.com/pastetheplan分享查询计划。没有这个,我们无法为您提供适当的帮助
  • 你能发布表格定义吗?
  • 使用index 并检查execution plan 反应

标签: sql sql-server tsql sqlperformance


【解决方案1】:

您的查询似乎应该归结为以下内容,这对您有用并且表现更好吗?

select
    t1.ID, t1.A, t1.B,
    IsNull(t1.c, t2.c) C,
    IsNull(t1.d, t2.d) D,
    IsNull(t1.e, t2.e) E,
    t1.f, t1.g, t1.h, t1.i
from TABLE1 t1
outer apply (
    select Max(c) c, Max(d) d, Max(e) e
    from TABLE2 t2
    where t2.Id = t1.Id
)t2

【讨论】:

  • 太棒了!这似乎可以解决问题。现在查询需要 33 秒。我仍然需要验证输出的值是否正确,但这看起来是正确的,而且速度要快得多。
  • 仍然需要 10 分钟,但这比之前的 30 分钟要好得多。接下来,我想我要开始查看执行计划,看看时间浪费在哪里了。我在表 2 上添加了一个索引,但是做一个简单的“SELECT * FROM Table2”并让它显示所有记录需要 3 分钟多一点,所以问题就在那里。 Table2 有大约 200 万条记录。使用非聚集索引在 SQL Server 中显示真的需要 3 分钟吗?
  • 有很多原因和未知数,您需要专门发布有关性能的问题,并提供表的详细信息、现有索引以及至关重要的执行计划。
  • 另外,它是持续时间的 1/3 并且击中您的 table2 一次而不是 3 次,所以至少这是有道理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 2014-08-28
  • 1970-01-01
  • 2015-03-24
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多