-
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个答案 按时间排序 按投票排序
-
采纳的答案
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
-
项目实际优化的一点经验,希望对您有用:
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性能调优秘笈 在数据库领域,IBM DB2因其稳定性和高效性而备受推崇,尤其是在大型企业级应用中。对于DB2数据库管理员(DBA)来说,掌握有效的SQL性能调优技巧至关重要。这不仅能提升系统的响应速度,还...
资源名称:DB2 SQL性能调优秘笈资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
T-SQL性能调优秘笈-基于SQL Server 2012窗口函数,适合数据库进阶。
### T-SQL性能调优秘笈 #### 一、T-SQL与SQL Server 2012 - **T-SQL简介**:T-SQL是Transact-SQL的简称,它是微软SQL Server数据库管理系统所使用的SQL方言,是一种用于管理SQL Server数据库的标准语言。 - **SQL ...
资源名称:T-SQL性能调优秘笈 基于SQL Server 2012窗口函数资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
T-SQL性能调优秘籍——基于SQL Server 2012窗口函数,书中提及的网站已经打不开了,在github上找到了。路径在附件中。
《DB2 SQL性能调优秘笈》是一本深入探讨如何优化DB2数据库系统中SQL查询性能的专业书籍。作者Tony Andrews是DB2领域的专家,他在这本书中分享了丰富的经验和实用技巧,帮助读者解决在实际工作中遇到的性能瓶颈问题。...
2、在Transact-SQL中使用窗口函数,可以针对许多问题进行查询的优化,以获得简单完美的解决方案。 3、T-SQL性能调优秘笈:基于SQL Server 2012窗口函数》基于SQLServer2012,讨论了SQL窗口、窗口函数、排序集合函数...
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语句优化53个规则详解。
Oracle SQL 性能调优是一个非常重要的课题,它涉及到 Oracle 数据库的性能优化,包括 SQL 语句优化、索引使用优化、多表关联查询操作优化、SQL 执行计划优化等。下面是Oracle SQL 性能调优的详细知识点: 1. Oracle...
描述中的“性能调优”意味着这本书将包含大量关于如何提高SQL查询效率和系统整体响应速度的建议。性能调优是数据库管理中的一个重要方面,它涉及到对数据库操作和查询进行细致的分析和改进,目的是为了减少执行时间...
SQL内存调优,可以对windows2003操作系统安装SQL内存划分
SQL性能调优是指数据库系统中对SQL语句的优化,以提高数据库系统的响应速度和查询效率。 Oracle的内部优化器工作机制可以合理改进查询语句的组织方式,提高数据库系统的响应速度,实现前端画面及平台应用的快速响应...
1. **查询分析**:SQL调优首先从理解查询开始。通过分析SQL语句,识别可能的性能瓶颈,比如复杂的联接操作、不恰当的索引使用、子查询的效率问题等。 2. **索引优化**:索引是提高查询速度的关键。创建合适的索引...
SQL调优是数据库管理中的重要环节,它涉及到对SQL查询的优化,以提高数据库的运行效率,减少资源消耗,提升整体系统性能。MyTun是一款专门用于SQL调优的工具,它能帮助数据库管理员和开发人员更好地理解SQL查询的...
最后,第五章“使用窗口函数的T-SQL解决方案”提供了一些实际问题的解决策略,展示了如何在实际业务场景中应用窗口函数,如时间序列分析、排名问题、移动平均和滑动窗口计算等。 通过学习这些源代码,读者不仅可以...
通过SQL Server的性能监视工具,如SQL Server Profiler和动态管理视图(DMV),可以追踪查询性能,找出潜在问题,并进行针对性优化。 总之,SQL语句调优是一个综合性的过程,涉及对查询逻辑、数据结构、系统配置等...
Oracle数据库作为业界广泛使用的数据库管理系统,其SQL调优是提升系统性能的关键环节。"高性能SQL调优"这一主题涵盖了许多相关知识点,包括但不限于以下内容: 1. **SQL优化基础**:SQL查询是数据库操作的核心,...