有这样一个语句效率很慢,谁能帮我分析一下怎么优化吗??
语句如下:
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中函数的调用。
具体如何优化,可以贴更多的语句出来,让大家看看。