通过调整表union all的顺序优化SQL

简介: 原文:通过调整表union all的顺序优化SQL  操作系统:Windows XP   数据库版本:SQL Server 2005   今天遇到一个SQL,过滤条件是自动生成的,因此,没法通过调整SQL的谓词达到优化的目的,只能去找SQL中的“大表”。
原文: 通过调整表union all的顺序优化SQL

  操作系统:Windows XP

  数据库版本:SQL Server 2005

  今天遇到一个SQL,过滤条件是自动生成的,因此,没法通过调整SQL的谓词达到优化的目的,只能去找SQL中的“大表”。有一个视图返回的结果集比较大,如果能调整的话,也只能调整该视图了。

  看了一下该视图的结构,里面还套用了另一层视图,直接看最里层视图的查询SQL。

SELECT  a.dfeesum_no ,
        a.opr_amt - ISNULL(b.dec_pay, 0) - ISNULL(b.dec_corrpay, 0)
        - ISNULL(b.dec_deduamt, 0) dec_amt ,
        a.dec_camt - ISNULL(b.dec_pay, 0) - a.dec_comprate
        * ISNULL(b.dec_deduamt, 0) dec_compamt ,
        a.dec_ramt - ISNULL(b.dec_corrpay, 0) - ( a.dec_comprate - 1 )
        * ISNULL(b.dec_deduamt, 0) dec_corramt ,
        a.dec_qty - ISNULL(b.dec_qty, 0) - ISNULL(b.dec_deduqty, 0) opr_qty ,
        ISNULL(b.dec_pay, 0) dec_pay ,
        ISNULL(b.dec_corrpay, 0) dec_corrpay ,
        ISNULL(b.dec_deduqty, 0) dec_deduqty ,
        ISNULL(b.dec_deduamt, 0) dec_deduamt ,
        ISNULL(b.dec_qty, 0) dec_qty
FROM    ctlm8686 a
        LEFT JOIN ( SELECT  dfeesum_no ,
                            SUM(dec_ramt) dec_pay ,
                            SUM(dec_corramt) dec_corrpay ,
                            SUM(dec_qty) dec_qty ,
                            SUM(CASE WHEN flag_dedu = '1' THEN dec_deduamt
                                     ELSE 0
                                END) dec_deduamt ,
                            SUM(CASE WHEN flag_dedu = '1' THEN dec_deduqty
                                     ELSE 0
                                END) dec_deduqty
                    FROM    dfeepay_03
                    GROUP BY dfeesum_no
                  ) b ON a.dfeesum_no = b.dfeesum_no
UNION ALL
SELECT  a.dfeesum_no ,
        a.dec_amt - ISNULL(b.dec_pay, 0) - ISNULL(b.dec_corrpay, 0)
        - ISNULL(b.dec_deduamt, 0) dec_amt ,
        a.dec_compamt - ISNULL(b.dec_pay, 0) - a.dec_comprate
        * ISNULL(b.dec_deduamt, 0) dec_compamt ,
        a.dec_corramt - ISNULL(b.dec_corrpay, 0) - ( a.dec_comprate - 1 )
        * ISNULL(b.dec_deduamt, 0) dec_corramt ,
        a.opr_qty - ISNULL(b.dec_qty, 0) - ISNULL(b.dec_deduqty, 0) opr_qty ,
        ISNULL(b.dec_pay, 0) dec_pay ,
        ISNULL(b.dec_corrpay, 0) dec_corrpay ,
        ISNULL(b.dec_deduqty, 0) dec_deduqty ,
        ISNULL(b.dec_deduamt, 0) dec_deduamt ,
        ISNULL(b.dec_qty, 0) dec_qty
FROM    dfeeapp_03 a
        LEFT JOIN ( SELECT  dfeesum_no ,
                            SUM(dec_ramt) dec_pay ,
                            SUM(dec_corramt) dec_corrpay ,
                            SUM(dec_qty) dec_qty ,
                            SUM(CASE WHEN flag_dedu = '1' THEN dec_deduamt
                                     ELSE 0
                                END) dec_deduamt ,
                            SUM(CASE WHEN flag_dedu = '1' THEN dec_deduqty
                                     ELSE 0
                                END) dec_deduqty
                    FROM    dfeepay_03
                    GROUP BY dfeesum_no
                  ) b ON a.dfeesum_no = b.dfeesum_no

  返回结果集有1433891行,其中

  SELECT COUNT(*) FROM dfeepay_03 --1103914
  SELECT COUNT(*) FROM ctlm8686 --1131586
  SELECT COUNT(*) FROM dfeeapp_03--302305

  上述SQL脚本中,子查询是相同的,即对子查询进行了两次扫描,可以考虑先让dfeeapp_03和ctlm8686union all,再left join dfeepay_03 。同时,对于子查询,先让dfeepay_03 表先查询出flag_dedu = '1'的数据,就不用再进行case when判断了。

  改写后的SQL如下

SELECT  a.dfeesum_no ,
        a.opr_amt - ISNULL(b.dec_pay, 0) - ISNULL(b.dec_corrpay, 0)
        - ISNULL(b.dec_deduamt, 0) dec_amt ,
        a.dec_camt - ISNULL(b.dec_pay, 0) - a.dec_comprate
        * ISNULL(b.dec_deduamt, 0) dec_compamt ,
        a.dec_ramt - ISNULL(b.dec_corrpay, 0) - ( a.dec_comprate - 1 )
        * ISNULL(b.dec_deduamt, 0) dec_corramt ,
        a.dec_qty - ISNULL(b.dec_qty, 0) - ISNULL(b.dec_deduqty, 0) opr_qty ,
        ISNULL(b.dec_pay, 0) dec_pay ,
        ISNULL(b.dec_corrpay, 0) dec_corrpay ,
        ISNULL(b.dec_deduqty, 0) dec_deduqty ,
        ISNULL(b.dec_deduamt, 0) dec_deduamt ,
        ISNULL(b.dec_qty, 0) dec_qty
FROM    ( SELECT    a.dfeesum_no ,
                    a.opr_amt ,
                    a.dec_camt ,
                    a.dec_comprate ,
                    a.dec_ramt ,
                    a.dec_qty
          FROM      ctlm8686 a
          UNION ALL
          SELECT    a.dfeesum_no ,
                    a.dec_amt ,
                    a.dec_compamt ,
                    a.dec_comprate ,
                    a.dec_corramt ,
                    a.opr_qty
          FROM      dfeeapp_03 a
        ) a
        LEFT JOIN ( SELECT  dfeesum_no ,
                            SUM(dec_ramt) dec_pay ,
                            SUM(dec_corramt) dec_corrpay ,
                            SUM(dec_qty) dec_qty ,
                            SUM(dec_deduamt) dec_deduamt,
                            SUM(dec_deduqty) dec_deduqty
                    FROM   dfeepay_03
                    WHERE flag_dedu = '1'
                    GROUP BY dfeesum_no
                  ) b ON a.dfeesum_no = b.dfeesum_no                

  跑这个视图的查询语句,从原来的一分半钟降到一分钟,对于整个SQL而言,则从原来跑几分钟的直接10S出结果。

 

目录
相关文章
|
1月前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
19天前
|
SQL 缓存 数据库
SQL慢查询优化策略
在数据库管理和应用开发中,SQL查询的性能优化至关重要。慢查询优化不仅可以提高应用的响应速度,还能降低服务器负载,提升用户体验。本文将详细介绍针对SQL慢查询的优化策略。
|
19天前
|
SQL 存储 BI
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
|
19天前
|
SQL 数据库
gbase 8a 数据库 SQL优化案例-关联顺序优化
gbase 8a 数据库 SQL优化案例-关联顺序优化
|
26天前
|
SQL 数据库 UED
SQL性能提升秘籍:5步优化法与10个实战案例
在数据库管理和应用开发中,SQL查询的性能优化至关重要。高效的SQL查询不仅可以提高应用的响应速度,还能降低服务器负载,提升用户体验。本文将分享SQL优化的五大步骤和十个实战案例,帮助构建高效、稳定的数据库应用。
41 3
|
1月前
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
109 10
|
1月前
|
SQL 存储 缓存
SQL Server 数据太多如何优化
11种优化方案供你参考,优化 SQL Server 数据库性能得从多个方面着手,包括硬件配置、数据库结构、查询优化、索引管理、分区分表、并行处理等。通过合理的索引、查询优化、数据分区等技术,可以在数据量增大时保持较好的性能。同时,定期进行数据库维护和清理,保证数据库高效运行。
|
26天前
|
SQL 缓存 监控
SQL性能提升指南:五大优化策略与十个实战案例
在数据库性能优化的世界里,SQL优化是提升查询效率的关键。一个高效的SQL查询可以显著减少数据库的负载,提高应用响应速度,甚至影响整个系统的稳定性和扩展性。本文将介绍SQL优化的五大步骤,并结合十个实战案例,为你提供一份详尽的性能提升指南。
45 0
|
2月前
|
SQL 资源调度 分布式计算
如何让SQL跑快一点?(优化指南)
这篇文章主要探讨了如何在阿里云MaxCompute(原ODPS)平台上对SQL任务进行优化,特别是针对大数据处理和分析场景下的性能优化。
|
2月前
|
SQL 监控 数据库
慢SQL对数据库写入性能的影响及优化技巧
在数据库管理系统中,慢SQL(即执行缓慢的SQL语句)不仅会影响查询性能,还可能对数据库的写入性能产生显著的不利影响