如何解决请求优化CTE、多个 LEFT JOIN、WHERE with OR
谁能给我建议如何优化这个请求?
比这个例子更多的左连接(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)
OR
b.date>=>=DATEFROMPARTS(YEAR(CURRENT_TIMESTAMP)-2,1)
OR
c.date>=>=DATEFROMPARTS(YEAR(CURRENT_TIMESTAMP)-2,1)
)
解决方法
如果您将“OR”条件移动到 JOIN,它将返回不同的结果。我的回答是“不”,除非你完全知道自己在做什么。
您可以尝试多种可能的方法来对抗性能:
- 如果可以,将 CTE 移至临时表。它使查询更小? 这将有助于优化器提出最佳计划。还有你 可以分别调两个部分。
- 可能使用“WHERE”在表 A(id,date) 上建立过滤索引 code='A'" - 如果过滤记录的数量是 相对较小
- 可能使用“WHERE”在表 f_ofcte(id) 上建立过滤索引 lib IN ('G','H')"
- 在 (id,date) 的其他表上建立索引
- 不确定您是否提供了完整查询,但看起来如下 部分完全未使用:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。