0 0

SQL查询调优问题5

各位看官,现有一个View如下:

SELECT REQUEST_ID,
    SO_NUM,
    JOB_NUM,
    MAIN_JOB_NUM,
    SO_TYPE,
    IBAS_EVENT_ID,
    END_CUST_NAME,
    MO_SHIP_SET_NAME,
    CASE
      WHEN BILLING_MILESTONE='PARTS SHIPMENT'
      THEN UPPER(DECODE(SHIP_SET_STATUS,'BOX RELEASE',UPPER(FS_APP_133_GET_CURRENT_STEP(N_PROCESS_INST)),UPPER(SHIP_SET_STATUS)))
      WHEN BILLING_MILESTONE IN ('ADVANCE PAYMENT','POST SHIPMENT')
      THEN UPPER(DECODE(SHIP_SET_STATUS,NULL,FS_APP_133_GET_CURRENT_STEP(N_PROCESS_INST),SHIP_SET_STATUS))
    END SHIP_SET_STATUS,
    LINES_COUNT,
    AMT_USD,
    LOT_PROMISED_DATE,
    CWD,
    BILLING_MILESTONE,
    N_PROCESS_INST,
    --FS_APP_069_GET_PROCESS_INST(HAND_OFF_REQUEST_ID) HAND_OFF_REQUEST_ID,
    HAND_OFF_REQUEST_ID,
    CWD_FLAG
  FROM
    (SELECT REQUEST_ID,
      SO_NUM,
      FS_APP_101_HAND_OFF_REQ(PROCESS_INST,'JOB_NUM') JOB_NUM,
      FS_APP_101_HAND_OFF_REQ(PROCESS_INST,'MAIN_JOB_NUM') MAIN_JOB_NUM,
      FS_APP_101_HAND_OFF_SUB_TYPE(PROCESS_INST) SO_TYPE,
      FS_APP_111_GET_IBAS_EVNT_ID(PROCESS_INST) IBAS_EVENT_ID,
      END_CUST_NAME,
      MO_SHIP_SET_NAME,
      DECODE(LENGTH(SHIP_SET_STATUS),1,NULL,SHIP_SET_STATUS) SHIP_SET_STATUS,
      SO_LINES_COUNT LINES_COUNT,
      CASE
        WHEN ((REQUEST_TYPE LIKE 'COMMERCIAL%'
        AND BILLING_MILESTONE='PARTS SHIPMENT')
        OR (REQUEST_TYPE     ='PROFORMA'))
        THEN TO_CHAR(MO_SHIP_SET_AMOUNT)
        ELSE DECODE(NEW_INV_AMOUNT,NULL,TO_CHAR(FS_APP_110_GET_EVNT_AMT(PROCESS_INST)),NEW_INV_AMOUNT)
      END AMT_USD,
      LOT_PROMISED_DATE,
      CWD,
      BILLING_MILESTONE,
      PROCESS_INST N_PROCESS_INST,
      --FS_APP_069_GET_PROCESS_INST(HAND_OFF_REQUEST_ID) HAND_OFF_REQUEST_ID,
      HAND_OFF_REQUEST_ID,
      (
      CASE
        WHEN TO_DATE(CWD) BETWEEN SYSDATE AND (SYSDATE+30)
        THEN 'Y'
        WHEN SYSDATE>TO_DATE(CWD)
        THEN 'R'
        ELSE 'N'
      END) AS CWD_FLAG
    FROM
      (SELECT N_PROCESS_INST PROCESS_INST,
        D_INS,
        D_UPD,
        MAX(DECODE(MY_ATT,'REQUEST_ID', MY_ATT_VAL)) REQUEST_ID,
        MAX(DECODE(MY_ATT,'SO_NUM', MY_ATT_VAL)) SO_NUM,
        MAX(DECODE(MY_ATT,'SHIP_SET_STATUS', MY_ATT_VAL)) SHIP_SET_STATUS,
        MAX(DECODE(MY_ATT,'TOTAL_AMOUNT', MY_ATT_VAL)) MO_SHIP_SET_AMOUNT,
        MAX(DECODE(MY_ATT,'SO_LINES_COUNT', MY_ATT_VAL)) SO_LINES_COUNT,
        MAX(DECODE(MY_ATT,'END_CUST_NAME', MY_ATT_VAL)) END_CUST_NAME,
        MAX(DECODE(MY_ATT,'MO_SHIP_SET_NAME', MY_ATT_VAL)) MO_SHIP_SET_NAME,
        MAX(DECODE(MY_ATT,'SHIP_SET_PROMISED_DATE', MY_ATT_VAL)) LOT_PROMISED_DATE,
        MAX(DECODE(MY_ATT,'CWD', MY_ATT_VAL)) CWD,
        MAX(DECODE(MY_ATT,'BILLING_MILESTONE', MY_ATT_VAL)) BILLING_MILESTONE,
        MAX(DECODE(MY_ATT,'HAND_OFF_REQUEST_ID', MY_ATT_VAL)) HAND_OFF_REQUEST_ID,
        MAX(DECODE(MY_ATT,'REQUEST_TYPE',MY_ATT_VAL)) REQUEST_TYPE,
        MAX(DECODE(MY_ATT,'NEW_INV_AMOUNT',MY_ATT_VAL)) NEW_INV_AMOUNT
      FROM
        (SELECT TAI.N_PROCESS_INST,
          TA.C_ATTRIBUTE MY_ATT,
          TAI.C_ATTRIBUTE_VALUE MY_ATT_VAL,
          TPI.D_INS D_INS,
          TPI.D_UPD D_UPD
        FROM Table_AAA TAI
        INNER JOIN Table_BBB ATTRIBUTE TA
        ON TA.C_ATTRIBUTE = TAI.C_ATTRIBUTE
        INNER JOIN Table_CCC TSP
        ON TSP.C_SUB_PROCESS = TA.C_SUB_PROCESS
        INNER JOIN Table_DDD TPI
        ON TPI.N_PROCESS_INST = TAI.N_PROCESS_INST
        WHERE TPI.C_CURRENT_STATUS NOT LIKE 'otr.shp.Close'
        AND TA.C_SUB_PROCESS  IN ('SH')
        AND TPI.C_SUB_PROCESS IN ('SH')
        )
      GROUP BY N_PROCESS_INST,
        D_UPD
      HAVING FS_APP_137_IS_SPLIT_REQ(N_PROCESS_INST)='N'
      )
    ORDER BY D_UPD DESC
    )

该查询的执行计划如下:
Plan hash value: 25602094

------------------------------------------------------------------------
| Id  | Operation                          | Name                      |
------------------------------------------------------------------------
|   0 | SELECT STATEMENT                   |                           |
|   1 |  VIEW                              |                           |
|*  2 |   FILTER                           |                           |
|   3 |    SORT GROUP BY                   |                           |
|   4 |     MERGE JOIN                     |                           |
|   5 |      SORT JOIN                     |                           |
|   6 |       NESTED LOOPS                 |                           |
|   7 |        NESTED LOOPS                |                           |
|*  8 |         TABLE ACCESS FULL          | Table_DDD   |
|   9 |         TABLE ACCESS BY INDEX ROWID| Table_AAA |
|* 10 |          INDEX RANGE SCAN          | TS_APP_006_IDX1           |
|* 11 |        INDEX UNIQUE SCAN           | TS_APP_PK                 |
|* 12 |      SORT JOIN                     |                           |
|  13 |       TABLE ACCESS FULL            | Table_CCC    |
------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("FS_APP_137_IS_SPLIT_REQ"("TAI"."N_PROCESS_INST")='N')
   8 - filter("TPI"."C_SUB_PROCESS"='SH' AND "TPI"."C_CURRENT_STATUS"
              NOT LIKE 'otr.shp.Close')
  10 - access("TPI"."N_PROCESS_INST"="TAI"."N_PROCESS_INST")
  11 - access("TA"."C_ATTRIBUTE"="TAI"."C_ATTRIBUTE" AND
              "TA"."C_SUB_PROCESS"='SH')
  12 - access("TSP"."C_SUB_PROCESS"="TA"."C_SUB_PROCESS")
       filter("TSP"."C_SUB_PROCESS"="TA"."C_SUB_PROCESS")

Note
-----
   - rule based optimizer used (consider using cbo)

老板认为这个View的执行效率太低了,要求我去优化:
现有如下问题:
1). 这个View可以查询出来11000多条记录,但是需要耗费120到150秒中的时间,请问这个正常吗?
2). 从执行计划上看,该查询的效率低的瓶颈在哪里?
3). 如果你认为有调优的空间,请给出你的思路
2012年9月19日 14:10

2个答案 按时间排序 按投票排序

0 0

采纳的答案


TABLE ACCESS FULL          | Table_DDD   |
TABLE ACCESS FULL            | Table_CCC    |

1、TSP.C_SUB_PROCESS  考虑建索引
2、TPI.N_PROCESS_INST  建索引
     TPI.C_SUB_PROCESS IN ('SH')    建索引

2012年9月19日 14:42
0 0

项目实际优化的一点经验,希望对您有用:
1.join的时候,结果集小的表放在最前面。这点没办法帮你实验,要自己去试。
2.where后面,对于条件明确的写在最前面,可以一下就缩小范围的条件要放在最前面。
如:
WHERE TPI.C_CURRENT_STATUS NOT LIKE 'otr.shp.Close'
        AND TA.C_SUB_PROCESS  IN ('SH')
        AND TPI.C_SUB_PROCESS IN ('SH')
可以改成:
WHERE TA.C_SUB_PROCESS = 'SH'
 and  TPI.C_SUB_PROCESS = 'SH'
  and  TPI.C_CURRENT_STATUS NOT LIKE 'otr.shp.Close'
3.in 尽量少用,如果条件明确,可以用or代替。
如:WHEN BILLING_MILESTONE IN ('ADVANCE PAYMENT','POST SHIPMENT')
可以改成:
WHEN BILLING_MILESTONE = 'ADVANCE PAYMENT' or BILLING_MILESTONE = 'POST SHIPMENT'

2012年9月20日 11:19

相关推荐

    DB2 SQL性能调优秘笈

    ### DB2 SQL性能调优秘笈 在数据库领域,IBM DB2因其稳定性和高效性而备受推崇,尤其是在大型企业级应用中。对于DB2数据库管理员(DBA)来说,掌握有效的SQL性能调优技巧至关重要。这不仅能提升系统的响应速度,还...

    DB2SQL性能调优秘笈

    资源名称:DB2 SQL性能调优秘笈资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    T-SQL性能调优秘笈-基于SQL Server 2012窗口函数

    T-SQL性能调优秘笈-基于SQL Server 2012窗口函数,适合数据库进阶。

    T-SQL性能调优秘笈 基于SQL Server 2012窗口函数_PDF电子书

    ### T-SQL性能调优秘笈 #### 一、T-SQL与SQL Server 2012 - **T-SQL简介**:T-SQL是Transact-SQL的简称,它是微软SQL Server数据库管理系统所使用的SQL方言,是一种用于管理SQL Server数据库的标准语言。 - **SQL ...

    T-SQL性能调优秘笈基于SQLServer2012窗口函数

    资源名称:T-SQL性能调优秘笈 基于SQL Server 2012窗口函数资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    T-SQL性能调优秘籍——基于SQL Server 2012窗口函数 代码附件

    T-SQL性能调优秘籍——基于SQL Server 2012窗口函数,书中提及的网站已经打不开了,在github上找到了。路径在附件中。

    DB2 SQL性能调优秘笈 . 美 Tony Andrews . PDF . ckook.pdf

    《DB2 SQL性能调优秘笈》是一本深入探讨如何优化DB2数据库系统中SQL查询性能的专业书籍。作者Tony Andrews是DB2领域的专家,他在这本书中分享了丰富的经验和实用技巧,帮助读者解决在实际工作中遇到的性能瓶颈问题。...

    T-SQL性能调优秘笈 基于SQL Server2012窗口函数.rar

    2、在Transact-SQL中使用窗口函数,可以针对许多问题进行查询的优化,以获得简单完美的解决方案。 3、T-SQL性能调优秘笈:基于SQL Server 2012窗口函数》基于SQLServer2012,讨论了SQL窗口、窗口函数、排序集合函数...

    T-SQL性能调优秘笈 基于SQL Server 2012窗口函数 源码和示例数据库

    Chapter 01 - SQL Windowing.sql Chapter 02 - A Detailed Look at Window Functions.sql Chapter 03 - Ordered Set Functions.sql Chapter 04 - Optimization of Window Functions.sql Chapter 05 - T-SQL ...

    oracle的SQL语句调优总结

    oracle的SQL语句调优总结,Oracle语句优化53个规则详解。

    Oracle Sql性能调优.ppt

    Oracle SQL 性能调优是一个非常重要的课题,它涉及到 Oracle 数据库的性能优化,包括 SQL 语句优化、索引使用优化、多表关联查询操作优化、SQL 执行计划优化等。下面是Oracle SQL 性能调优的详细知识点: 1. Oracle...

    T-SQL性能调优秘笈 基于SQL Server 2012窗口函数

    描述中的“性能调优”意味着这本书将包含大量关于如何提高SQL查询效率和系统整体响应速度的建议。性能调优是数据库管理中的一个重要方面,它涉及到对数据库操作和查询进行细致的分析和改进,目的是为了减少执行时间...

    SQL内存调优

    SQL内存调优,可以对windows2003操作系统安装SQL内存划分

    SQL性能调优

    SQL性能调优是指数据库系统中对SQL语句的优化,以提高数据库系统的响应速度和查询效率。 Oracle的内部优化器工作机制可以合理改进查询语句的组织方式,提高数据库系统的响应速度,实现前端画面及平台应用的快速响应...

    sql调优 sql调优

    1. **查询分析**:SQL调优首先从理解查询开始。通过分析SQL语句,识别可能的性能瓶颈,比如复杂的联接操作、不恰当的索引使用、子查询的效率问题等。 2. **索引优化**:索引是提高查询速度的关键。创建合适的索引...

    sql调优工具mytun

    SQL调优是数据库管理中的重要环节,它涉及到对SQL查询的优化,以提高数据库的运行效率,减少资源消耗,提升整体系统性能。MyTun是一款专门用于SQL调优的工具,它能帮助数据库管理员和开发人员更好地理解SQL查询的...

    源码T-SQL性能调优秘笈 基于SQL Server 2012窗口函数

    最后,第五章“使用窗口函数的T-SQL解决方案”提供了一些实际问题的解决策略,展示了如何在实际业务场景中应用窗口函数,如时间序列分析、排名问题、移动平均和滑动窗口计算等。 通过学习这些源代码,读者不仅可以...

    数据库SQL语句调优的一些经验

    通过SQL Server的性能监视工具,如SQL Server Profiler和动态管理视图(DMV),可以追踪查询性能,找出潜在问题,并进行针对性优化。 总之,SQL语句调优是一个综合性的过程,涉及对查询逻辑、数据结构、系统配置等...

    高性能SQL调优

    Oracle数据库作为业界广泛使用的数据库管理系统,其SQL调优是提升系统性能的关键环节。"高性能SQL调优"这一主题涵盖了许多相关知识点,包括但不限于以下内容: 1. **SQL优化基础**:SQL查询是数据库操作的核心,...

Global site tag (gtag.js) - Google Analytics