oracle 游标内存自动释放,ORACLE中的触发器和游标是在内存中吗?

在csdn上看到一个网友问的一个问题

ORACLE中触发器和游标执行是在内存中吗,

是不是挺耗资源,应尽量少用?

呵呵呵,这样的问题一下就把人问懵了,一时也不知道从哪里开始回答,问题倒不是很复杂,只不过笔者的问题把不同的概念杂和在一起,所以一时也不知道从哪里开始回答了。

我们来看看部分答案

实例是在内存中运行的,两者也是在内存中执行

注意效率就好,如果需要,还是要用触发器和游标的

游标打开并使用完后记得close

触发器和游标是两个概念。

触发器是数据库里的一类对象,和function以及procedure一样,是一个PLSQL代码端,编译以后存在实例中,而游标是运行过程中的一个结果集的指针,trigger可以看做是内存中的静态地址,而cursor是内存中的动态部分, 这两个在这方面没有可必行。

游标类似于数据集合的指针,性能比单个的循环query要优,但是会占用资源,所以要合理的使用。trigger是内存中的静态部分,是一个可执行的代码段,所以性能由你的实现决定。

结论先别下,我们来看看这里涉及到的理论点。

什么是触发器  什么是游标

触发器即为trigger, 是Oracle里的一种对象, 和function,sp, package,匿名的plsql段等一样,是一段PLSQL语法写的程序代码段,Oracle会编译成可执行代码,放到shared pool里,以备执行。属于内存部分里的静态部分,或者share pool不够被清空,或者改变重新编译而移出内存。

游标叻,

游标这里有两种不同的层次上的认识,一种是窄义上的,即PLSQL里都一种类型Cursor,经常在plsql里作为select批量的结果集后的存储的对象,我们可以把他看做是一个数据集合的指针,在PLSQL里通过cursor游标的操作,遍历整个批量返回的结果集,从而完成我们PLSQL里访问数据的目的, 这里可以看到,这块是动态的,不同的调用可能有不同的cursor,随之代码运行的执行完毕,这个cursor也随之而消亡,很显然这部分和具体的调用进程有关,是存在UGA里的。

游标还有一个广义上的含义,在以前解答一个有关硬解析的问题中提到过,父游标,子游标这样的游标,很显然这里的游标,这里的游标是硬解析的产物,然后被装载到library cache里,很显然这部分是shared pool里叻。

通过对这里我们对理论知识的研讨,很明确我们可以发现,这些对象肯定是存在于内存中的,不过由于各自的作用和实质上的差异,他们存在在内存的不同的结构之中。

至于第二个问题,是不是耗资源,这个问题是很明显的,trigger耗不好内存,取决于这个trigger有多大,结构有多复杂,执行过程中整个系统的状况。 而这个游标耗不耗资源叻,完全看的是游标的区域有多大,也就是你的数据量有多大, 而父子游标的资源就是看你的游标本身的资源状况如何了,和trigger一样。

至于尽量少用,这个问题有些哲学话了,没有绝对好的东东,只有最适合的东西,把她用在最适合的时候。 你还会在乎她应该是少用还是多用么。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值