暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL优化案例| UPDATE优化案例

安呀智数据坊 2025-06-05
65

注: 本文为安丫科技焱焱枫的原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。

在数据库应用中,SQL 性能至关重要。低效 SQL 常致系统响应迟缓,而优化能显著提速。

本案例中的SQL 来源于某客户业务系统中的核心查询语句,为严格遵循数据安全与隐私保护原则,已对涉及客户敏感信息的表名、字段名以及数据值等进行脱敏处理。


01

 适用环境 

  • oracle 11g+

  • linux 6.9+


02

 Top SQL概况 

下面列出我们发现的特定模块中Top SQL的相关情况:


03

 SQL优化方案 

1. SQL_ID:7ts08a2d6qbgb

1)SQL文本

这条SQL超过了700行,截取关键部分分析

    UPDATE /*+index(TEST,IDX_XX_01)*/ TBL_XX_HEADER TEST
       SET (TEST.COL_SUM,
            TEST.COL_BEGIN,
            TEST.COL_PERIOD,
            TEST.COL_INCOMING,
            TEST.COL_END,
            TEST.COL_UPD_DATE,
            TEST.COL_UPD_BY) =
           (SELECT SUM(LN.COL_SUM),
                   SUM(LN.COL_BEGIN),
                   SUM(LN.COL_PERIOD),
                   SUM(LN.COL_INCOMING),
                   SUM(LN.COL_END),
                   SYSDATE,
                   FND_GLOBAL.USER_ID
              FROM CUX.TBL_XX_LINES LN
             WHERE LN.KEY_1 = TEST.KEY_1
               AND LN.COL_PERIOD = TEST.COL_PERIOD
               AND LN.ORG_ID = TEST.ORG_ID
               AND (LN.ATTR_1 IS NULL OR
                   LN.ATTR_1 IN ('产品1''产品2''产品3'))
             GROUP BY LN.KEY_1, LN.COL_PERIOD)
     WHERE TEST.ORG_ID = 5565
       AND TEST.ORGANIZATION_ID = 5561
       AND TEST.COL_PERIOD = '2021-10'
       AND TEST.KEY_1 < 0;


    2)SQL执行计划

      ------------------------------------------------------------------------------------------------------------------------------
      | Id  | Operation                    | Name              | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
      ------------------------------------------------------------------------------------------------------------------------------
      |   0 | UPDATE STATEMENT             |                   |       |       |    68 (100)|          |       |       |
      |   1 |  UPDATE                      | TBL_XX_HEADER     |       |       |            |          |       |       |
      |*  2 |   INDEX RANGE SCAN           | IDX_XX_01         |     3 |   183 |     4   (0)| 00:00:01 |       |       |
      |   3 |   SORT GROUP BY NOSORT       |                   |     1 |    94 |     2   (0)| 00:00:01 |       |       |
      |   4 |    PARTITION RANGE SINGLE    |                   |     1 |    94 |     2   (0)| 00:00:01 |   KEY |   KEY |
      |*  5 |     TABLE ACCESS STORAGE FULL| TBL_XX_LINES      |     1 |    94 |     2   (0)| 00:00:01 |   KEY |   KEY |
      ------------------------------------------------------------------------------------------------------------------------------
      Predicate Information (identified by operation id):
      ---------------------------------------------------
      2 - access("TEST"."ORG_ID"=:B3 AND "TEST"."COL_PERIOD"=:B1 AND "TEST"."ORGANIZATION_ID"=:B2 AND "TEST"."KEY_1"<0)
      5 - filter(("LN"."KEY_1"=:B1 AND "LN"."COL_PERIOD"=:B2 AND "LN"."ORG_ID"=:B3 AND ("LN"."ATTR_1" IS NULL OR INTERNAL_FUNCTION("LN"."ATTR_1"))))


      3)SQL资源消耗                 

        PLAN  CHI USER        CPU(MS)  ELA(MS)     DISK          GET        ROWS      ROWS APPLI(MS) CONCUR(MS) CLUSTER(MS) USER_IO(MS) FIRST_LOAD_TIME                                     
        EXEC          HASH VALUE  NUM NAME       PRE EXEC PRE EXEC PRE EXEC     PRE EXEC    PRE EXEC PRE FETCH  PER EXEC   PER EXEC    PER EXEC    PER EXEC LAST_LOAD_TIME                                      
        ---------- ------------- ---- ---------- -------- -------- -------- ------------ ----------- --------- --------- ---------- ----------- ----------- ----------------------                              
        0              918035873    0 APPS       3,511,121  3,712,412    1,713  434,385,844           0         0         0          4         885         582 11-01/15:3.11-01/15:3                               

        该SQ修改数据在20000条数据,近期未执行成功。

        04

         问题分析及优化思路 

        通过分析SQL文本,发现该SQL为update类型。

        通过分析执行计划,TBL_XX_LINES作为NL被驱动表走全表扫描,而该表的体积近2GB,这就导致该SQL执行效率非常低。

        结合以上分析,该SQL创建合适的索引即可优化。


        05

         优化方案 

        1. 创建组合索引

          CREATE INDEX CUX.IDX_XX_04 ON CUX.TBL_XX_LINES(ORG_ID,KEY_1,COL_PERIOD,ATTR_1)
          ONLINE PARALLEL 16;
          ALTER INDEX CUX.IDX_XX_04 NOPARALLEL;


          06

           优化效果对比 

          通过确认关键表数据量,制定执行计划,可以减少每次查询的逻辑读和物理读,提高SQL执行性能。


          写在最后


          SQL 优化看似细枝末节,实则关乎系统性能与数据效率的根基。

          每一个慢查询的背后,往往隐藏着数据结构、业务逻辑与执行计划之间的微妙博弈。

          我们希望通过这一系列实际案例的拆解,帮助你在实战中掌握优化思路与方法论。

          未来我们还将持续更新更多 典型场景 + 优化实录,敬请关注 安呀智数据坊·案例分享!

          有任何数据库相关问题,欢迎留言交流,或联系我们获取专业支持~

          作者介绍

          大家好,我是刘峰,安丫科技创始人 & 数据库技术高级讲师,专注于 PostgreSQL、国产数据库运维与迁移、数据库性能优化 等方向。

          作为 PG中国分会官方授权讲师、PostgreSQL ACE 讲师认证专家,我长期活跃在一线项目实战中,拥有 10年以上大型数据库管理与优化经验,曾深度参与电信、金融、政务等多个行业的数据库性能调优与迁移项目。

          欢迎关注我,一起深入探索数据库的无限可能,技术交流不设限!

          📌 觉得有收获的话,记得点赞、收藏、转发支持一下哦,别忘了关注我获取更多数据库干货~


          END

          关键词回复(可见相应文章):

          oracle、mysql、pg、postgresql、sql、性能优化、故障处理、数据迁移、备份恢复、版本升级、补丁管理、深度巡检、解决方案、架构设计......

          小助手

          有任何问题或疑问,欢迎加V进群探讨哦~


          \ | /

          动动你的手指

          【安呀智数据坊】加个星标吧~

          这样你就不会丢下我啦~

          记得加星标呀!

          文章转载自安呀智数据坊,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论