hur.cn - 华软网

 热门搜索

高手帮忙,关于oracle自定义函数调用的问题

  作者:未知    来源:网络    更新时间:2018/2/6
我在oracle中自定义了一个函数,get_data 在数据库中调用是这样的
select bh,get_data(bh,1),get_data(bh,2) where get_data(bh,1)>0 or get_data(bh,2)>0
程序没用错误,但速度慢的很,请高手给出解决的办法。
------华软网友回答------
增加个索引在bh上,说说你的函数都作了些什么?
------华软网友回复------
我是跟据这个编号,要根据相应要求计算出一个数据值
------华软网友回复------
select * from (select bh,get_data(bh,1) a,get_data(bh,2) b) tbl where tbl.a>0 or tbl.b>0;
试一试这个.
------华软网友回复------
忘了from
------华软网友回复------
不知这什么,这个更慢啊
------华软网友回复------
不知为什么,这个更慢啊

------华软网友回复------
再没人知道了吗
------华软网友回复------
看看执行计划吧,一定是用了全表扫描
如果增加index的话,函数也要在内

------华软网友回复------
你可以去用pl-sql调试下,
看下执行过程,是否有全表扫描的现象
别告诉我你不知道用pl_sql查看执行计划
------华软网友回复------
能说明一下吗
------华软网友回复------
笨办法有一个,就是把get_data(bh,1),get_data(bh,2)都做为一个列(非计算列)保存到数据库中,用触发器生成。这样搜索的时候必然要快一些。

主要和表记录数和get_data的复杂度有关。
------华软网友回复------
能问一下是在pb里调用的吗,怎么调用的?
------华软网友回复------
是在pb里调用,请问w7a8(阿飞)怎么才能把函数填加到索引里
------华软网友回复------
是DECLARE test PROCEDURE FOR HE_TEST(:tin,:tout1,:tout2) ;
EXECUTE test ;
FETCH test INTO :tout1, :tout2 ;
这样调用吗?
------华软网友回复------
怎么在pl_sql 看sql的执行步骤 执行情况

new --- explain plan window 

把你要执行的sql 拷贝到窗口中
根据你要查看的对象选择optimizer  goal 

你在下面就可以看到oralce的执行过程了

------华软网友回复------
select bh,get_data(bh,1),get_data(bh,2) where 0<get_data(bh,1)
union
select bh,get_data(bh,1),get_data(bh,2) where 0<get_data(bh,2)

试一试这个.

但是你在索引列应用函数,可能导致索引不会被使用,从而效率很低,
可以把函数的算法以及具体功能讲一讲吗?看看有没有提高效率的可能.
     
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。