关于#sql#的问题:我想优化一下查询速度,找到了查询特别慢的地方

我想优化一下查询速度,找到了查询特别慢的地方

when st.cor_no = 2021 then
          (select sum(e.amount)
             from cz_lnpay2021.ba_bgt_info e
            where e.agency_code = st.agency_code
              and e.cor_bgt_doc_no = st.cor_bgt_doc_no
              and e.mof_div_code = 210000000
              and e.fiscal_year = 2021
              and e.is_deleted != 1
              and e.bill_type_id = 301
              and e.biz_type_id in ('001', '002', '003', '004')
              and e.amount > 0)

这里的2021换成2022都不会慢,总体内容大概如下

select st.agency_code,
       st.agency_name,
       st.cor_bgt_doc_no,
       case
         when st.cor_no = 2020 then
          (select sum(e.amount)
             from cz_lnpay2021.ba_bgt_info e
            where e.agency_code = st.agency_code
              and e.cor_bgt_doc_no = st.cor_bgt_doc_no
              and e.mof_div_code = 210000000
              and e.fiscal_year = 2020
              and e.is_deleted != 1
              and e.bill_type_id = 301
              and e.biz_type_id in ('001', '002', '003', '004')
              and e.amount > 0)
         when st.cor_no = 2021 then
          (select sum(e.amount)
             from cz_lnpay2021.ba_bgt_info e
            where e.agency_code = st.agency_code
              and e.cor_bgt_doc_no = st.cor_bgt_doc_no
              and e.mof_div_code = 210000000
              and e.fiscal_year = 2021
              and e.is_deleted != 1
              and e.bill_type_id = 301
              and e.biz_type_id in ('001', '002', '003', '004')
              and e.amount > 0)
         else
          0
       end as ysamt,
       st.pro_name,
       sum(st.CARRYOVERS_AMT),
       sum(JZ)
  from a st
               
               
 group by st.agency_code,
          st.agency_name,
          st.cor_no,
          st.cor_bgt_doc_no,
          st.pro_name

这种情况我该怎么优化呢


WITH bgt_info AS (
SELECT
    agency_code,
    cor_bgt_doc_no,
    fiscal_year,
    SUM( amount ) AS amount 
FROM
    cz_lnpay2021.ba_bgt_info 
WHERE
    mof_div_code = 210000000 
    AND is_deleted != 1 
    AND bill_type_id = 301 
    AND biz_type_id IN ( '001', '002', '003', '004' ) 
    AND amount > 0 
GROUP BY
    agency_code,
    cor_bgt_doc_no,
    fiscal_year 
    ) SELECT
    st.agency_code,
    st.agency_name,
    st.cor_bgt_doc_no,
    COALESCE( bgt_info.amount, 0 ) AS ysamt,
    st.pro_name,
    SUM( st.CARRYOVERS_AMT ),
    SUM( JZ ) 
FROM
    a st LEFT JOIN bgt_info ON st.agency_code = bgt_info.agency_code 
    AND st.cor_bgt_doc_no = bgt_info.cor_bgt_doc_no 
    AND st.cor_no = bgt_info.fiscal_year 
GROUP BY
    st.agency_code,
    st.agency_name,
    st.cor_no,
    st.cor_bgt_doc_no,
    st.pro_name

img


他这一块有问题

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7767783
  • 你也可以参考下这篇文章:【SQL开发实战技巧】系列(三十七):数仓报表场景☞从表内始终只有近两年的数据,要求用两列分别显示其中一年的数据聊行转列隐含信息的重要性
  • 除此之外, 这篇博客: 如何分析sql执行效率中的 在开发中,经常会遇到一个接口返回数据的等待时间过长,这时候我们就需要查看是否因为慢sql导致, 定位慢 SQL 有如下两种解决方案: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 1.查看慢查询日志确定已经执行完的慢查询
      2.show processlist 查看正在执行的慢查询

    下面我就介绍如何使用以及两者的使用场景:

  • 您还可以看一下 王进老师的数据库SQL查询,最佳案例讲解课程中的 数据库SQL查询课程总结小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    针对查询速度慢的问题,可以采取以下几种措施来提升查询速度:

    1. 优化SQL语句本身:避免使用 * ,少用函数和 like,不用嵌套语句,将大SQL拆成小SQL等。建议参考参考资料中的博客进行详细了解。

    2. 建立索引、优化索引:可以通过explain关键字来查看是否使用了索引,是否存在全表扫描等现象。对于联合索引,应该按照最左前缀原则进行查询。对于范围查询,只能应用于索引中的范围列。还可以根据业务场景和数据分布情况,判断是否需要加冗余字段来提升查询速度。

    3. 优化数据库参数:需要专业的DBA进行处理,通过调整参数来优化数据库性能。

    4. 优化服务器:需要专业的运维或项目经理进行处理,通过优化硬件、网络等方面来提升服务器性能。

    5. 采用读写分离和主从复制:通过将写入操作和读取操作分离到不同的数据库服务器上,可以提升整体的并发处理能力和查询速度。

    6. 将查询结果缓存到Redis等缓存中:在查询结果被频繁请求时,可以将查询结果缓存到内存中,以提升查询速度。

    建议结合具体的业务场景和数据分布情况,采取以上措施中的一部分或多部分来进行优化。在优化过程中,还需要注意不要一味追求性能,而忽略了系统的稳定性和安全性。