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日

悬赏问题

  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)