求解以下SQL的执行差别
SQL_1:执行时间<1秒
select distinct c.cxszh,c.cxsdm,u.cxsjc from
(SELECT distinct trim(A.ACC_CODE) TGZH,TRIM(A.SHORT_NAME) cxsjc FROM ODS.KHZH_UAP_UPACCOUNT A
WHERE TRIM(ODSYXTBH)='UAP' and KIND_CODE != '03'
and ksrq in(select max(ksrq) from ODS.KHZH_UAP_UPACCOUNT where trim(ACC_CODE)=trim(A.ACC_CODE)
and TRIM(ODSYXTBH)='UAP' and KIND_CODE != '03') and rownum<=100000 ) u,
(select cxszh,cxsdm from ods.khzh_cxs where TRIM(FXSJLYDM) = '1'
AND TRIM(ODSYXTBH) = 'FX' AND TRIM(JLZTDM)='1') c
where u.tgzh = c.cxszh
SQL_2:大约20分钟
select distinct c.cxszh,c.cxsdm,u.cxsjc from
(SELECT distinct trim(A.ACC_CODE) TGZH,TRIM(A.SHORT_NAME) cxsjc FROM ODS.KHZH_UAP_UPACCOUNT A
WHERE TRIM(ODSYXTBH)='UAP' and KIND_CODE != '03'
and ksrq in(select max(ksrq) from ODS.KHZH_UAP_UPACCOUNT where trim(ACC_CODE)=trim(A.ACC_CODE)
and TRIM(ODSYXTBH)='UAP' and KIND_CODE != '03')
) u,
(select cxszh,cxsdm from ods.khzh_cxs where TRIM(FXSJLYDM) = '1'
AND TRIM(ODSYXTBH) = 'FX' AND TRIM(JLZTDM)='1') c
where u.tgzh = c.cxszh
sql_1与sql_2的差别在于SQL_1多了个查询返回100000行数据
C结果集有400行数据,U结果集有16000行数据,ODS.KHZH_UAP_UPACCOUNT 有20000多行数据,查询速度相差如此大,求解
------解决方案--------------------1)在PL/SQLdeveloper 下按F5看一下执行计划.是否存在table access full的情况. 需要根据具体的情况去优化索引,这种能够解决一部分问题.
2)不同的结果集,根据连接结果产生的笛卡尔积的大小不一样,对于USER IO 以及内存占用大小也是有很大的区别的.查询时间不一样很正常.
------解决方案--------------------简单。把两条语句放到11G 里面跑一下,然后看看执行计划是什么。再看看自己的语句是怎么走的。就知道问题所在了。
------解决方案--------------------看看执行计划吧。
理论上说,rownum<=100000,你也没有记录数据超过10W的,这个条件相当于无效啊