发一段SQL高分优化,现在运行30秒,领导说要搞到10秒
发布时间:2010-05-20 14:01:29 文章来源:www.iduyao.cn 采编人员:星星草
发一段SQL高分请教高手优化,现在运行30秒,领导说要搞到10秒。
SELECT /*+index(T HG_JOB_ALL_OUTPUT_2)*/
SUBSTR(M.ITEM_M, 3, 8) 料號,
TO_CHAR(T.CREATE_DATE, 'YYYY-MM-DD') 日期,
TRIM(M.ITEM_M_HG) 料號1,
0 材不數,
0 總提檢數,
0 單片產量,
0 總損品數,
0 CG提檢數,
0 CG損品數,
0,
0 HX提檢數,
0 HX損品數,
0,
ROUND(DECODE(T.ENGINEER,
'二厂ZX',
DECODE(SUBSTR(T.ITEM, 2, 1),
'C',
(T.SP_QTY / NVL(MSI.UNIT_WEIGHT, 1) +
T.SP2_QTY / NVL(MSI.UNIT_WEIGHT, 1)),
'H',
(T.SP_QTY / NVL(MSI.UNIT_WEIGHT, 1) +
T.SP2_QTY / NVL(MSI.UNIT_WEIGHT, 1))))) CX提檢數,
ROUND(DECODE(T.ENGINEER,
'二厂ZX',
DECODE(SUBSTR(T.ITEM, 2, 1),
'C',
(T.SP2_QTY / NVL(MSI.UNIT_WEIGHT, 1) +
T.SP_QTY / NVL(MSI.UNIT_WEIGHT, 1)),
'H',
(T.SP2_QTY / NVL(MSI.UNIT_WEIGHT, 1) +
T.SP_QTY / NVL(MSI.UNIT_WEIGHT, 1))))) CX損品數,
ROUND(DECODE(T.ENGINEER,
'二厂ZX',
DECODE(SUBSTR(T.ITEM, 2, 1),
'C',
(T.SP2_QTY / NVL(MSI.UNIT_WEIGHT, 1) +
T.SP_QTY / NVL(MSI.UNIT_WEIGHT, 1)),
'H',
(T.SP2_QTY / NVL(MSI.UNIT_WEIGHT, 1) +
T.SP_QTY / NVL(MSI.UNIT_WEIGHT, 1))))) *
NVL(T.PER_COST, 0) CX_COST,
ROUND(DECODE(T.ENGINEER,
'二厂ZX',
DECODE(SUBSTR(T.ITEM, 2, 1),
'C',
-1 * (T.SP_QTY / NVL(MSI.UNIT_WEIGHT, 1) +
T.SP2_QTY / NVL(MSI.UNIT_WEIGHT, 1)),
'H',
-1 * (T.SP_QTY / NVL(MSI.UNIT_WEIGHT, 1) +
T.SP2_QTY / NVL(MSI.UNIT_WEIGHT, 1))))) ZX提檢數,
ROUND(DECODE(T.ENGINEER,
'二厂ZX',
DECODE(SUBSTR(T.ITEM, 2, 1),
'C',
-1 * (T.SP2_QTY / NVL(MSI.UNIT_WEIGHT, 1) +
T.SP_QTY / NVL(MSI.UNIT_WEIGHT, 1)),
'H',
-1 * (T.SP2_QTY / NVL(MSI.UNIT_WEIGHT, 1) +
T.SP_QTY / NVL(MSI.UNIT_WEIGHT, 1))))) ZX損品數,
ROUND(DECODE(T.ENGINEER,
'二厂ZX',
DECODE(SUBSTR(T.ITEM, 2, 1),
'C',
-1 * (T.SP2_QTY / NVL(MSI.UNIT_WEIGHT, 1) +
T.SP_QTY / NVL(MSI.UNIT_WEIGHT, 1)),
'H',
-1 * (T.SP2_QTY / NVL(MSI.UNIT_WEIGHT, 1) +
T.SP_QTY / NVL(MSI.UNIT_WEIGHT, 1))))) *
NVL(T.PER_COST, 0) ZX_COST,
0 JH提檢數,
0 JH損品數,
0,
0 TM提檢數,
0 TM損品數,
0,
0 二厂客退品損品數,
0,
0 二厂脫膜組損品數,
0,
0 二厂其它不良損品數,
0,
0 LSS,
0 LSS_COST,
0 損品定額
FROM APPS.HG_JOB_ALL_OUTPUT T,
APPS.HG_JOB_BOM M,
INV.MTL_SYSTEM_ITEMS_B MSI
WHERE (T.ITEM = M.ITEM_END OR T.ITEM = M.ITEM_M)
AND MSI.SEGMENT1 = T.ITEM
AND SUBSTR(T.ITEM, 2, 1) IN ('C', 'H')
AND T.ENGINEER = '二厂ZX'
AND SUBSTR(M.ITEM_M, 3, 6) IN
(SELECT M.ITEM_M
FROM APPS.HG_TWO_RCBF M
WHERE M.MATERIAL = 'SOFT'
AND (TO_CHAR(T.CREATE_DATE, 'YYYY-MM-DD') <=
TO_CHAR(M.END_DATE, 'yyyy-mm-dd') OR M.END_DATE IS NULL))
AND TO_CHAR(T.CREATE_DATE, 'YYYY-MM-DD') BETWEEN '2015-07-01' AND
'2015-07-31'
AND T.CREATE_DATE > SYSDATE - 730
UNION ALL
SELECT substr(T.ITME1, 3, 6),
T.DATE1,
'',
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
T.LSS1,
NVL(T.LSS1, 0) * NVL(T.PER_COST, 0) LSS_COST,
0
FROM APPS.HG_RCTEAM_LSS_T T
------解决思路----------------------
APPS.HG_TWO_RCBF 有CREATE_DATE该列索引吗?有的话改成这样子
T.CREATE_DATE BETWEEN date( '2015-07-01') AND date( '2015-07-31')
------解决思路----------------------
把 UNION ALL 两部分数据,分开跑一下,看看各占用的时间,
应该是第一个的时间比较长。
AND SUBSTR(M.ITEM_M, 3, 6) IN 这个可能会占用比较多的 CPU时间。
------解决思路----------------------
WHERE (T.ITEM = M.ITEM_END OR T.ITEM = M.ITEM_M)
AND MSI.SEGMENT1 = T.ITEM
AND SUBSTR(T.ITEM, 2, 1) IN ('C', 'H')
AND T.ENGINEER = '二厂ZX' 這裡已經有這個條件了,為什麼還要decode T.ENGINEER??
AND SUBSTR(M.ITEM_M, 3, 6) IN
(SELECT M.ITEM_M
FROM APPS.HG_TWO_RCBF M
WHERE M.MATERIAL = 'SOFT'
AND (TO_CHAR(T.CREATE_DATE, 'YYYY-MM-DD') <=
TO_CHAR(M.END_DATE, 'yyyy-mm-dd') OR M.END_DATE IS NULL))
AND TO_CHAR(T.CREATE_DATE, 'YYYY-MM-DD') BETWEEN '2015-07-01' AND
'2015-07-31' 這裡勁量不要對字段to_char,
------解决思路----------------------
重点关注T和M两表
WHERE (T.ITEM = M.ITEM_END OR T.ITEM = M.ITEM_M)
AND MSI.SEGMENT1 = T.ITEM
AND SUBSTR(T.ITEM, 2, 1) IN ('C', 'H')
AND T.ENGINEER = '二厂ZX'
首先,T作为驱动表,上面的其中一个条件将T表的数据量限制到1条,是哪个条件呢?可以针对该字段单独建一个索引。目前走的xxx_2看起来是组合索引,效率恐怕并不高
其次,M表进行了全表扫描,但实际上关联条件的过滤效果非常强。在item_end和item_m上分别创建一条普通索引试试
以上两个问题若能解决,速度应该能加快不少
另外,你的in子查询里还设了一个别名同样为M的表,最好不要这么做,容易引起语义混乱
------解决思路----------------------
中间一定有个过滤效果相当好的字段,否则就是统计信息有问题。抓住这个字段建个索引
cbo对or采取的执行计划有时并不很聪明
可以试着将这段代码改成
select .....
from ...
where t.item=m.item_end and msi....................
union
select ...
from ...
where t.item=m.item_m and msi.....................
union all
.................
看看效果如何
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
创建同义词报ORA-00955
各位大神,我创建公有同义词,怎么会报ORA-00955错?很多人遇到建立私有同义词有这个错,我怎么建立公有同义词也...
-
impdp导入为什么索引会占的非常大。
本帖最后由 xixi_168 于 2014-07-19 23:10:47 编辑
在做数据...
-
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
测试没有成功。
ORA-12514: TNS: 监听程序当前无法识别连接描述...
-
oracle神牛进!!!
1、如何用sql查出oracle自带的所有函数?
2、给定ascii码,如何用sql查出对应的字符?
3、为什么在java中和在oracl...
-
oracle的cmd执行一个.sql文件,遇到异常时退出而不是继续执行
假设有一个1.sql文件,内容是
Declare
X varchar2(20);
Begin
Sc...
-
oracle查看某一条记录中为空的字段总数
oralce中,某一条记录中怎么得到这条记录中字段值为空的总数呢?(不为空的总数也可)
比如:id a1...
-
三台ORACLE通信,DBLINK
三台ORACLE服务器,A、B、C,其中A和B在同一个内网,B为双网卡可以连接外网,C为外网ORACLE。现在在B上已经建立DBL...
-
OracleOraDb10g_home1TNSListener无法启动
OracleOraDb10g_home1TNSListener无法启动,每次启动都提示:“在本地计算机无法启动Ora...
-
虚拟机安装RAC,网卡可以用NAT方式连接吗?
大家好:
我看教程上设的,安装配置RAC,配置虚拟机的两块网卡,第一块网卡(eth0,配置公用I...
-
求解oracle监听服务名问题
最近在做服务器的双机热备时,发现两边的监听服务名不一致,一个是OracleOraDb11g_home1TNSListen...