日期:2014-05-17  浏览次数:20898 次

求解以下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的,这个条件相当于无效啊