【发布时间】: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