当前位置: 代码迷 >> Oracle技术 >> ORACLE话语效率优化
  详细解决方案

ORACLE话语效率优化

热度:220   发布时间:2016-04-24 08:06:43.0
ORACLE语句效率优化
有这样一个语句效率很慢,谁能帮我分析一下怎么优化吗??
语句如下:
SELECT a.JIAGEID,
       b.KUCUNSL,
       a.DANJIA1,
       a.ZHAOBIAOYPBZ,
       a.YAOPINMC,
       a.ZHANGBULB,
       a.YAOPINGG,
       a.CHANDIMC,
       a.BAOZHUANGDW,      
       a.BAOZHUANGLIANG,
       a.YAOPINLX, 
       PKG_1.Fun_1(JIAGEID,YINGYONGID,10,3,开始日期,结束日期)
  FROM a,b
 WHERE a.JIAGEID = b.JIAGEID

情况是 里面有个函数,屏蔽函数效率就特别的快
FUN_1里面有这么一段语句,屏蔽掉,效率就上来了,如下:
SELECT Nvl(SUM(l.Churuksl), 0) sl
                  INTO n_YaoPinXH2 
                  FROM table1 l
                 WHERE l.Churukfs IN  ('67', '68', '59', '61')  
                   and l.Jiageid =  prm_Jiageid            
                   AND (l.Jizhangrq> 开始日期 and l.jizhangrq< 结束日期);
PS:table1 是一个超级大的表,我把上面的语句中TABLE1的涉及到的字段jizhangrq,Churuksl,Jiageid 都加上索引了,上午加的,快了,下午就跟以前又一样慢了。谁能教教我怎么加索引,有哪些步骤,我该从哪下手分析呢,效率慢跟上面的a,b表有关系吗?求高人指点,最好能方法和语句。

最后谢谢各位。

------解决思路----------------------
把整个函数贴出了看看吧,应该先优化函数里的东西,如果可以将函数放在select执行是最好的。像你这样写的话,结果集每一条记录都会调用一次函数,结果集越大速度就越慢了。
------解决思路----------------------
上午很快,下午就慢了,数据量变化很大吗?
若数据量变化不大的话,是不是查询计划发生改变了
有个大表,是否可以依据你的业务逻辑建立分区表?然后建立分区索引
------解决思路----------------------
1、查看执行计划
2、复杂且记录数多的计算,尽量不要用函数
------解决思路----------------------
执行计划,函数内容都贴出来
------解决思路----------------------
table1基于字段Jiageid做HASH分区
------解决思路----------------------
分区,时间分区。
------解决思路----------------------
既然是你贴的那个语句慢,就只需要优化那个就行了。
SELECT Nvl(SUM(l.Churuksl), 0) sl
                  INTO n_YaoPinXH2 
                  FROM table1 l
                 WHERE l.Churukfs IN  ('67', '68', '59', '61')  
                   and l.Jiageid =  prm_Jiageid            
                   AND (l.Jizhangrq> 开始日期 and l.jizhangrq< 结束日期);
你得看这个语句的执行计划,你建的索引是不是一直在启用,可以使用hint来规定执行计划。

------解决思路----------------------
首先,sql调用函数,会导致sql引擎和plsql引擎来回切换,效率会低些,况且你这种写法应该是每一行数据都会让它们切换一次,数据量越大切换越多,效率更低;
其次,你贴的语句有限,如何优化就要好好看看执行计划了;
最后,你可以观察一下你的那些数据,可不可以通过函数先处理数据,然后在使用,尽量减少在sql中函数的调用。

具体如何优化,可以贴更多的语句出来,让大家看看。
  相关解决方案