前言:
今天大家对“oracle游标值返回”大体比较关怀,我们都需要知道一些“oracle游标值返回”的相关资讯。那么小编同时在网上汇集了一些对于“oracle游标值返回””的相关文章,希望你们能喜欢,朋友们一起来学习一下吧!SQL解析与游标
SQL解析是数据库执行一条SQL语句的必要步骤。它主要完成对SQL语句的各种分析、检查,并制定执行计划。最后将执行计划交由执行器去执行即可。而游标是作为SQL解析的结果缓存在共享池中,可作为后续执行同一SQL时直接调用使用。这里所说的游标,不要和PL/SQL开发中的游标混淆。这里的游标是指在Oracle中解析SQL语句生成执行计划的一个载体,保存在共享池中的一种数据结构。
数据库首先将SQL文本转化为ASCII字符,然后根据哈希算法计算其对应的值(就是对应于V$SQL.SQL_ID)。根据计算出的这个值到共享池中的一个区域(就是library cache)中找到对应的一块结构(又称bucket),然后比较bucket里是否存在该SQL语句。
如果找到该语句,则返回对应的执行计划(可能有多个,需要选择一个)。如果没有找到,则进入硬解析的过程。
硬解析。如果数据库无法在内存中找到这条语句,则需要经历一个硬解析的过程。在这个过程中需要申请一块内存空间(并通过名叫latch的结构保证不被别人访问)。同时还需要访问数据字典获得对象必要的信息。
数据库硬解析的过程就是生成游标的过程;
软解析的过程就是找到以前生成的游标的过程;
软解析就是直接在客户端就找到了缓存在本地的游标过程。
从性能的角度而言,需要尽可能地避免发生硬解析。
这也是为什么数据库要将共享游标保存在库缓存中的原因。
因为这样,属于这个实例的每一个进程都可以重用它们。
有两个原因可以解释为什么硬解析的开销较高。
第一个原因是硬解析过程很长,涉及大量复杂操作,这些都非常依赖CPU的操作。
第二个原因是要分配内存来将父游标与子游标保存在库缓存中。
由于库缓存是在所有的会话之间共享的,库缓存中的内存分配必须串行执行。
在实际操作中,在分配父游标和子游标所需的内存之前,必须取得一个保护共享池的闩锁。
虽然软解析的影响已经远比硬解析要小,但还是需要尽量避免软解析,因为它也会导致某种串行处理。
事实上,为了所有共享的父游标,也必须取得一个保护库缓存的闩锁。
总的来讲,需要尽可能避免硬解析和软解析,因为它们都会抑制应用程序的可扩展性。
最新版保姆级SQL Server的下载安装详细教程(附带安装包+资料)_哔哩哔哩_bilibili
标签: #oracle游标值返回 #oracle硬解析sql排查 #oracle游标缓存