SQL解析与游标

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

游标   SQL
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章