Oracle OR 和 UNION ALL效率问题

java豆 2014-03-12 03:06:09
各位好,我最近遇到这样一个问题。请大家帮我分析下原因。谢谢。
前提是客户数据量很大。
客户执行我写的一段SQL,结果执行了5分钟才执行完。
SELECT TABLE1.STRK,
TABLE1.ITM,
TABLE1.LT,
TABLE1.LC,
TABLE1.ID,
TABLE2.LOGICALLO,
TABLE1.QTY,
TABLE3.CCI,
'NO' UPTCC,
TABLE4.RTKEY
FROM TABLE4, TABLE1, TABLE5, TABLE2, TABLE3
WHERE TABLE4.PROCESSFLAG = '0'
AND TABLE1.STRK >= TABLE4.STRKSTART
AND TABLE1.STRK <= TABLE4.STRKEND
AND TABLE1.ITM >= TABLE4.ITMSTART
AND TABLE1.ITM <= TABLE4.ITMEND
AND TABLE1.LC >= TABLE4.LCSTART
AND TABLE1.LC <= TABLE4.LCEND
AND TABLE1.STRK = TABLE3.STRK
AND TABLE1.STRK = ITMXTABLE2.STRK
AND TABLE1.ITM = ITMXTABLE2.ITM
AND TABLE1.LC = ITMXTABLE2.LC
AND TABLE1.LC = TABLE2.LC
AND TABLE1.QTY > 0
AND TABLE2.LCLEVEL >= TABLE4.LCLEVELSTART
AND TABLE2.LCLEVEL <= TABLE4.LCLEVELEND
AND TABLE2.LCT NOT IN
('f', 'I', 'O', 'P', 'ND', 'RT', 'AGED')
AND TABLE2.PTZ >= TABLE4.ZONESTART
AND TABLE2.PTZ <= TABLE4.ZONEEND
AND TABLE2.PTZ IN
(SELECT PTZ
FROM ARADT
WHERE ARKEY >= TABLE4.ARSTART
AND ARKEY <= TABLE4.AREND)
AND TABLE3.CCTABLE5 <> '1'
AND TABLE3.TYPE = '1'
AND TABLE1.QTY > 0
AND TABLE1.QTY <= 2.147483647E9
AND TABLE4.RTKEY = '0000000031'
AND ((TABLE4.omv = '0') OR
(TABLE4.omv = '1' AND
TABLE1.ID IN
(SELECT ID
FROM V_CCID
WHERE V_CCID.ADDDATE >= TABLE4.STARTDATE
AND V_CCID.ADDDATE <= TABLE4.ENDDATE)))

ORDER BY TABLE4.RTKEY,
TABLE1.STRK,
TABLE1.ITM,
TABLE1.LC


其中红色部分是执行慢的原因,后来我改成UNION ALL ,只用了几秒钟。


SELECT STRK,
ITM,
LT,
LC,
ID,
LOGICALLO,
QTY,
CCI,
'UPTCC,
RTKEY
from ( SELECT
TABLE1.STRK,
TABLE1.ITM,
TABLE1.LT,
TABLE1.LC,
TABLE1.ID,
TABLE2.LOGICALLO,
TABLE1.QTY,
TABLE3.CCI,
'NO' UPTCC,
TABLE4.RTKEY
FROM TABLE4, TABLE1, TABLE5, TABLE2, TABLE3
WHERE TABLE4.PROCESSFLAG = '0'
AND TABLE1.STRK >= TABLE4.STRKSTART
AND TABLE1.STRK <= TABLE4.STRKEND
AND TABLE1.ITM >= TABLE4.ITMSTART
AND TABLE1.ITM <= TABLE4.ITMEND
AND TABLE1.LC >= TABLE4.LCSTART
AND TABLE1.LC <= TABLE4.LCEND
AND TABLE1.STRK = TABLE3.STRK
AND TABLE1.STRK = ITMXTABLE2.STRK
AND TABLE1.ITM = ITMXTABLE2.ITM
AND TABLE1.LC = ITMXTABLE2.LC
AND TABLE1.LC = TABLE2.LC
AND TABLE1.QTY > 0
AND TABLE2.LCLEVEL >= TABLE4.LCLEVELSTART
AND TABLE2.LCLEVEL <= TABLE4.LCLEVELEND
AND TABLE2.LCT NOT IN
('f', 'I', 'O', 'P', 'ND', 'RT', 'AGED')
AND TABLE2.PTZ >= TABLE4.ZONESTART
AND TABLE2.PTZ <= TABLE4.ZONEEND
AND TABLE2.PTZ IN
(SELECT PTZ
FROM ARADT
WHERE ARKEY >= TABLE4.ARSTART
AND ARKEY <= TABLE4.AREND)
AND TABLE3.CCTABLE5 <> '1'
AND TABLE3.TYPE = '1'
AND TABLE1.QTY > 0
AND TABLE1.QTY <= 2.147483647E9
AND TABLE4.RTKEY = '0000000031'
AND TABLE4.omv = '0'

UNION ALL

SELECT TABLE1.STRK,
TABLE1.ITM,
TABLE1.LT,
TABLE1.LC,
TABLE1.ID,
TABLE2.LOGICALLO,
TABLE1.QTY,
TABLE3.CCI,
'NO' UPTCC,
TABLE4.RTKEY
FROM TABLE4, TABLE1, TABLE5, TABLE2, TABLE3
WHERE TABLE4.PROCESSFLAG = '0'
AND TABLE1.STRK >= TABLE4.STRKSTART
AND TABLE1.STRK <= TABLE4.STRKEND
AND TABLE1.ITM >= TABLE4.ITMSTART
AND TABLE1.ITM <= TABLE4.ITMEND
AND TABLE1.LC >= TABLE4.LCSTART
AND TABLE1.LC <= TABLE4.LCEND
AND TABLE1.STRK = TABLE3.STRK
AND TABLE1.STRK = ITMXTABLE2.STRK
AND TABLE1.ITM = ITMXTABLE2.ITM
AND TABLE1.LC = ITMXTABLE2.LC
AND TABLE1.LC = TABLE2.LC
AND TABLE1.QTY > 0
AND TABLE2.LCLEVEL >= TABLE4.LCLEVELSTART
AND TABLE2.LCLEVEL <= TABLE4.LCLEVELEND
AND TABLE2.LCT NOT IN
('f', 'I', 'O', 'P', 'ND', 'RT', 'AGED')
AND TABLE2.PTZ >= TABLE4.ZONESTART
AND TABLE2.PTZ <= TABLE4.ZONEEND
AND TABLE2.PTZ IN
(SELECT PTZ
FROM ARADT
WHERE ARKEY >= TABLE4.ARSTART
AND ARKEY <= TABLE4.AREND)
AND TABLE3.CCTABLE5 <> '1'
AND TABLE3.TYPE = '1'
AND TABLE1.QTY > 0
AND TABLE1.QTY <= 2.147483647E9
AND TABLE4.RTKEY = '0000000031'
AND TABLE4.omv = '1' AND
TABLE1.ID IN
(SELECT ID
FROM V_CCID
WHERE V_CCID.ADDDATE >= TABLE4.STARTDATE
AND V_CCID.ADDDATE <= TABLE4.ENDDATE)

)

ORDER BY RTKEY,
STRK,
ITM,
LC
...全文
1057 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
现在 2014-08-14
  • 打赏
  • 举报
回复 1
good good study,day day up.
小灰狼W 2014-08-14
  • 打赏
  • 举报
回复
就是由于cost估算的不够准确,以及统计信息的不完整 例如当你用where a=1 or a=2时,cbo判断走a的索引并不合适,走全表扫描更好 当改写成 select ... from ... where a=1 union all select ... from .. where a=2 这是两个语句的拼接,各自有自己的执行计划,走a字段的索引就在情理之中 当条件更复杂的时候,cbo的误判就可能更加严重
bw555 2014-08-14
  • 打赏
  • 举报
回复
楼上正解,从执行计划中查找时间消耗的差异是最快的 测试的时候可以先将其他一些无关的表和条件去掉,否则执行计划看起来就太乱了
sych888 2014-08-14
  • 打赏
  • 举报
回复
看看执行计划差异在什么地方
流浪川 2014-03-12
  • 打赏
  • 举报
回复
归根结底,我的判断依据就是是否走索引,是否跑的快。。别的我还真说不出道理来。。
流浪川 2014-03-12
  • 打赏
  • 举报
回复
这个从效率上来说,因素很多,看具体执行计划,是否走索引。 正常习惯我是喜欢将多个or改写成union来使用。但是在走索引的时候,其实还是or的效率高一些。 所以个人认为不固定,看具体环境下那个快用哪个呗。。
内容概要:本文系统研究了构网型变流器的正负序阻抗解耦特性及其在弱电网环境下的稳定性表现,重点依托Matlab/Simulink仿真平台,构建了详细的阻抗数学模型,设计了解耦控制策略,并采用小信号扫频法进行频域辨识与稳定性验证。研究深入探讨了构网型变流器与传统跟网型逆变器在正负序阻抗特性上的本质差异,结合虚拟同步发电机(VSG)等先进控制技术,分析其在抑制宽频带振荡、削弱锁相环动态耦合等方面的优越性。文中不仅提供了完整的仿真模型与MATLAB代码实现,还整合了光伏、风电、储能、微电网等多类新能源系统的阻抗建模与稳定性分析资源,形成了一套面向新型电力系统稳定性的综合性技术资料体系,具有较强的科研复现与工程参考价值。; 适合人群:面向具备电力电子、电力系统自动化、新能源并网等专业背景的研究生、高校教师及工程技术人员,特别适用于从事阻抗建模、小干扰稳定性分析、宽频振荡机理研究以及撰写高水平学术论文的科研工作者。; 使用场景及目标:①掌握构网型变流器正负序阻抗建模与扫频辨识的仿真方法;②深入理解VSG等构网型控制在弱电网中提升稳定性的内在机理;③复现顶刊论文中的阻抗分析流程与稳定性判据应用;④利用提供的成熟模型与代码加速科研进程,支撑课题研究与学术成果产出。; 阅读建议:建议结合文中提供的Simulink模型与MATLAB代码,按照“理论建模—仿真搭建—扫频激励—频响提取—Nyquist判据分析”的完整流程进行实践操作,重点关注扫频信号的注入方式、频率范围设置及阻抗曲线的物理意义解读,并参考博士论文复现案例深化对复杂动态耦合问题的理解。

17,134

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧