oracle 游标处理过程

来源:互联网 发布:aes算法密钥最小长度 编辑:程序博客网 时间:2024/06/02 20:53

打开游标:系统会在与这个会话相关的服务器进程的服务器端私有内存中为这个游标分配一个内存结构

,也就是用户全局区

解析游标:有一条sql语句与这个游标关联。解析后内容(包括执行计划)会被加载到共享池中的library cache

。UGA的结构会被更新,以保存指向这个共享游标在库缓存中的位置。

定义输出变量:如果sql语句返回数据,必须先定义接受数据的变量。这一点不仅对查询语句很重要

对于使用returing字句的delete、insert、和update语句也很重要。

绑定输入变量:如果sql语句使用了绑定变量,必须提供他们的值。绑定的过程是不做什么检查。如果指定了无效的数据,执行的过程

整会报出运行时错误。

执行游标:执行这个sql语句。

获取游标:如果sql语句返回数据,这一步会接收这些数据。特别是在查询语句中

大部分的处理工作都是在这一步进行的。在查询语句中,可能只会读取部分记录。换句话讲,

游标有可能在取到所有记录前被关闭。

关闭游标:释放uga中与这个游标有关的资源,从而这个资源可供其他游标使用。

在library cache中的共享游标不会被清除。它会继续保留在library cache中,等待被重新使用。

如下图



游标解析过程

l  包含VPD的约束条件----如果系统中使用了VPD,并且被解析的sql语句中引用的某张表激活了他的话

 ,安全车罗生成的约束条件就会被添加到WHERE字句中。

l  语法、语义以及访问权限检查----这一步不仅确认sql语句是否被正确书写,而且要确认sql语句引用的对象是否都存在,并且确认解析他的这个歌用户是否有必要的权限来访问他们。

l  将父游标保存到库缓存--只要不存在共享的父游标就会在库缓存中分配一些内存。并将新产生的父游标保存进去与父游标相关关键信息是这个sql语句的文本

l  逻辑优化----在这个阶段,通过应用各种不同的转化技巧,会生成语义上等同的新的sql语句。做完这件事后,可选的执行计划的数量与搜索空间都会增长。他的母的就是在不进行转换的情况下寻找无法被考虑到的执行计划。

l  物理优化----这个阶段会执行好几个操作。首先会生成与每个逻辑优化产生的sql语句有的执行计划。接着,根据数据字典找到统计信息或者动态采样收集的统计信息,计算出一个与各个执行计划相关的开销。最后拥有最低开销的执行计划会被选中。简单的将,查询优化器通过探索搜索空间来寻找最有效的执行计划。

l  将子游标保存到库缓存-----首先分配内存,然后将共享子游标(chile cursor)存储进去,最后将它与父游标(parent cursor)进行关联。与子游标有关的关键内容是执行计划与执行环境。一旦保存到库缓存中,父游标与子游标就可以分别通过视图v$sqlarea和v$sql具体化。可以通过以下三个字段来确定一个游标:address 、hash_value 和child_number。父游标由address和hash_value来唯一识别,而子游标则由所有这三个字段来唯一识别。另外从oracle10g开始,可以通过使用sql_id字段来代替address和hash_value的组合来达到同样的目的。

l  当共享父游标与子游标都可用,因而只需要采取前两个步骤时,对应的解析就会被称为软解析。而当所有的操作都需要执行时,则会被称为硬解析