qq_38331464 2023-04-01 19:36 采纳率: 100%
浏览 47
已结题

DB2线上告警,三表联查sql优化。

上周工作中遇到了三表联查的sql优化问题。

线上告警sql查询时间15S,而且占用数据库大量资源,导致其他交易请求访问成功率下降。

下面是原有sql:

select * from A
left join
B A.cd = B.cd
left join C A.pid = c.pid
where B.condition1 and B.condition2

优化之后的sql

select * from A
inner join
(select * from B where B.condition1 and B.condition2 ) f A.cd = f.cd
left join C A.pid = c.pid

1.我想把B表的数据集变小 , 所以把 left join 变成 inner join ,
2.B.condition 被我做成索引

有以下两个问题:
1.这样优化是否得到的结果和原来的sql运行结果是否一致。
2.这样优化是否有性能上的提升。

  • 写回答

6条回答 默认 最新

  • 小逸2023 2023-04-01 19:45
    关注
    该回答引用ChatGPT
    针对这个问题,我可以给出以下分析和建议:
    1. 优化后的SQL语句与原SQL语句的结果应该是一致的,因为优化后的SQL语句只是将B表的数据集变小,不会影响查询结果。但是,如果原SQL语句中存在重复数据,优化后的SQL语句可能会返回不同的结果。
    2. 优化后的SQL语句应该会有性能上的提升,因为将B表的数据集变小后,查询的数据量会减少,从而减少了查询的时间和占用的数据库资源。同时,将B.condition1和B.condition2做成索引也可以提高查询效率。
    下面是优化后的SQL语句的代码:

    select * from A
    inner join
    (select * from B where B.condition1 and B.condition2 ) f
    on A.cd = f.cd
    left join C on A.pid = C.pid

    这里将B表的数据集变小,只查询符合条件的数据,然后再与A表进行内连接,最后再与C表进行左连接。同时,将B.condition1和B.condition2做成索引,可以提高查询效率。
    需要注意的是,优化SQL语句时需要考虑查询的逻辑和数据量,不能简单地将所有的left join都改成inner join,否则可能会影响查询结果。同时,需要根据实际情况选择合适的索引,避免过多的索引对数据库性能造成负面影响。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 4月9日
  • 已采纳回答 4月1日
  • 创建了问题 4月1日

悬赏问题

  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥20 java在应用程序里获取不到扬声器设备