为什么oracle自定义函数这么慢?即使是简单的返回值?

就比如说selectfunc(col)fromtable和selectcolfromtable比较。(相差100倍左右)func(numnumber)beginretur... 就比如说select func(col) from table和select col from table比较。(相差100倍左右)
func(num number)
begin
return num;
end;
展开
 我来答
choikyo
2012-05-02 · TA获得超过5455个赞
知道小有建树答主
回答量:668
采纳率:0%
帮助的人:580万
展开全部
如果纯粹看您给的例子,那返回的都是单一数值,区别是单纯遍历语句结果,前者是通过函数。我想您是想通过这个例子来问,如何提高函数在QUERY中的效率问题,因为你例子本身没有实际应用价值,只可能是你为解决问题的实验了。不知是否正确。

因为不知道你的具体工作情况,我只能提供多种可能,有的方法也许受权限,和你工作的内容限制,无法实现。我个人经验来看。
1. 尽量把函数放在你Login的schema下,对权限的检测,如果是自身的schema会提高速度。
2. 如果是你要生成report,你看看有没有可能,或者权限,生成Materialized view, 而不直接在他的Table或者View里面找。 Materialized View的方法有时候在数据仓库中会用来提高速度,当然 前提是你有这个权限。
3.就这个语句来看,我个人觉得没有必要从索引来找。你对自己的数据肯定比我们要熟悉的多,过多的索引反而会是速度变慢。觉得要么从表,要么从函数去入手。祝好运
百度网友bae7667
2012-05-01 · TA获得超过936个赞
知道小有建树答主
回答量:404
采纳率:100%
帮助的人:146万
展开全部
这个取决于你SQL的where条件之后会有多少条数据。即便你函数里紧紧只是返回参数本身,但毕竟函数被调用执行的时间不可忽略。举例如果你搜到结果是1000条,那么这个函数就要被打开执行1000次,肯定会影响效率。加上业务表本身数据量如果大,又没索引的帮助,这个吞吐量是很吓人的。
更多追问追答
追问
我做的这个经常需要返回百万级的数据,我用了自定义索引,所以索引方面耗时基本和select col 差不多,时间基本上耗在调用函数上,我主要是想知道有什么改进方式没有。
追答
我有个疑问。。是不是只能让oracle所在的服务器去做事。。我更倾向于用代码结合结果集去做事。。
还有一个逻辑问题,如果给用户看的,那么怎么着也要分个页吧,这样这种效率问题就迎刃而解了,因为分页后数据也就百来十条,,逐个调用function也不会太卡,如果分页SQL中就包含了这个调用,那只能说明数据结构设计的不太合理了,有较真的意思。。。
如果是后台处理或自己人用的,那不出错的情况下,能用就得了吧。。。
本来大数据量的问题基本都是分批处理的,不仅仅是慢,还有一个时间周期内数据的有效性问题,很多情况下必须在N之内处理,否则先前处理的都可能不对了。。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
fxtrade114
2012-04-30 · TA获得超过316个赞
知道小有建树答主
回答量:552
采纳率:100%
帮助的人:427万
展开全部
你是如何做对比的?
追问
更新了问题补充,麻烦看下。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
micro0369
2012-04-30 · TA获得超过1.2万个赞
知道大有可为答主
回答量:9250
采纳率:85%
帮助的人:4021万
展开全部
一般不会出现这种情况,请详细介绍一下具体情况
更多追问追答
追问
更新了问题补充,麻烦看下。
追答
不应该是这儿的问题,你的where怎么写的?

如果col建了索引,而where中 col=xxx能使用索引,但fun(col)一般不能使用索引,不过好像可以对fun(col)建立索引
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式