【发布时间】:2021-04-05 16:06:51
【问题描述】:
谁能给我建议如何优化这个请求?
比这个例子中更多的左连接(20+),主要是用外键获取值,有什么优化可能?
CTE 用于创建聚合,但 CTE 表用于主体请求,那么它有用吗?
在主表上具有简单条件的条件和具有多个表的字段的第二个条件 OR 的情况下,是否可以更好地添加具有 3 个字段的最大日期的列并具有简单的第二个条件(没有 OR) ?
SQL Server 2015+
WITH
cte AS
(
SELECT
e_ofcte.id,
SUM(CASE WHEN f_ofcte.lib='G' THEN 1 ELSE 0 END) AS n1,
SUM(CASE WHEN f_ofcte.lib='H' THEN 1 ELSE 0 END) AS n2
FROM e_ofcte
INNER JOIN f_ofcte ON f_ofcte.id=e_ofcte.id
WHERE f_ofcte.lib IN ('G','H')
AND e_ofcte.date>=DATEFROMPARTS(YEAR(CURRENT_TIMESTAMP)-2,1,1)
GROUP BY
e_ofcte.id
)
SELECT
a.id,
b.sid,
c.sid,
cte.n1,
cte.n2
FROM a
LEFT JOIN cte ON a.id=cte.id
LEFT JOIN b ON a.id=b.id
LEFT JOIN c ON a.id=c.id
LEFT JOIN e_ofcte ON a.id=e_ofcte.id
LEFT JOIN i ON a.id=i.id
LEFT JOIN j ON a.id=j.id
LEFT JOIN f_ofcte ON a.id=f_ofcte.id
WHERE a.code='A'
AND
(
a.date>=>=DATEFROMPARTS(YEAR(CURRENT_TIMESTAMP)-2,1,1)
OR
b.date>=>=DATEFROMPARTS(YEAR(CURRENT_TIMESTAMP)-2,1,1)
OR
c.date>=>=DATEFROMPARTS(YEAR(CURRENT_TIMESTAMP)-2,1,1)
)
【问题讨论】:
-
可以粘贴执行计划吗? brentozar.com/pastetheplan
-
为什么要加入多个表,但不使用这些表中的任何列(i、j 等)?
-
使用其他表的列。我将粘贴执行计划。谢谢
-
您好,由于隐私问题,我将无法粘贴执行计划。
-
我不知道为什么粘贴执行计划比粘贴 SQL 有更大的隐私问题,但如果是这样的话……你至少可以粘贴完整的 SQL 语句吗?如果有任何常量值让您担心隐私问题,那么您可以将它们替换为 'x' 或类似的东西
标签: sql sql-server optimization query-optimization