【体系结构】深入shard pool
时间:2010-10-14 来源:kankanhoney
一条sql语句在shared pool中流程:
我们模拟一个环境,当一个用户进程发出了一条sql语句,select name,age from tab where a=1; 首先服务器进程会先检查该语句语法正确性,接着通过对照数据字典对语句中涉及的表、索引、视图等对象及用户的权限进行检查即语义检查(tab表是否存在,用户是否有相关的权限等),如果以上任一检查没有通过,就返回一个错误,但不会明确的指出是语法检查出错还是语义检查出错。
通过检查,server process会将该语句转换成ASCII等效数字码,但如果select *时,当该表中某个字段变化,则转换的ASCII也是不同的。接着会将该ASCII码传递给hash函数,将其hash得到一个hash值,进程会到shared pool中的libary cache中寻找是否相同的数值, (找的过程是再次对hash过的hash值再hash,然后hash值跟backet链编号进行匹配,找到相应的链。若找块,则对物理地址进行hash,找到相应的链,进而找到块。)
如果存在,服务器进程将使用这条语存在SHARED POOL中的已解析过的执行计划来执行这是软解析,若只有父游标没子游标 需要进行reload.如果不存在,在shared pool找lur 链的free chuck(先获得latch) ,生成父子游标则必须进行以下两个步骤:语句的优化(生成执行计划)和生成执行编码:服务器进程根据ORACLE选用的优化模式以及数据字典中是否存在相应对象的统计数据和是否使用了存储大纲来生成一个执行计划或从存储大纲中选用一个执行计划,最后再生成一个编译代码,这是硬解析。
绑定变量共享sql语句:
解析的过程需要绑定变量,当oracle在shared pool中查找相同的SQL语句的过程中,如果SQL语句使用 了绑定变量(bind variable),那么就是比较SQL语句的静态部分,静态部分是有限的,很容易就能够缓存在内存里,从而找到相同的SQL语句的概率很高,达到sql语句共享。如果没有使用绑定变量,则就是比较SQL语句的静 态部分和动态部分,而动态部分的变化是无限的,因此这样的SQL语句很难被缓存在shared pool里。毕竟内存是有限的,不可能把所有的动态部分都缓 存在shared pool里,即便能够缓存,管理这样一个无限大的shared pool也是不可能完成的任务。不使用绑定变量导致的直接结果就是,找到相同的SQL语句的概率很低,导致必须完整的解析SQL语句,也就导致消耗更多的资源。 从这里也可以看出,只有我们使用了绑定变量才能够更有效的利用shared pool。
我们模拟一个环境,当一个用户进程发出了一条sql语句,select name,age from tab where a=1; 首先服务器进程会先检查该语句语法正确性,接着通过对照数据字典对语句中涉及的表、索引、视图等对象及用户的权限进行检查即语义检查(tab表是否存在,用户是否有相关的权限等),如果以上任一检查没有通过,就返回一个错误,但不会明确的指出是语法检查出错还是语义检查出错。
通过检查,server process会将该语句转换成ASCII等效数字码,但如果select *时,当该表中某个字段变化,则转换的ASCII也是不同的。接着会将该ASCII码传递给hash函数,将其hash得到一个hash值,进程会到shared pool中的libary cache中寻找是否相同的数值, (找的过程是再次对hash过的hash值再hash,然后hash值跟backet链编号进行匹配,找到相应的链。若找块,则对物理地址进行hash,找到相应的链,进而找到块。)
如果存在,服务器进程将使用这条语存在SHARED POOL中的已解析过的执行计划来执行这是软解析,若只有父游标没子游标 需要进行reload.如果不存在,在shared pool找lur 链的free chuck(先获得latch) ,生成父子游标则必须进行以下两个步骤:语句的优化(生成执行计划)和生成执行编码:服务器进程根据ORACLE选用的优化模式以及数据字典中是否存在相应对象的统计数据和是否使用了存储大纲来生成一个执行计划或从存储大纲中选用一个执行计划,最后再生成一个编译代码,这是硬解析。
绑定变量共享sql语句:
解析的过程需要绑定变量,当oracle在shared pool中查找相同的SQL语句的过程中,如果SQL语句使用 了绑定变量(bind variable),那么就是比较SQL语句的静态部分,静态部分是有限的,很容易就能够缓存在内存里,从而找到相同的SQL语句的概率很高,达到sql语句共享。如果没有使用绑定变量,则就是比较SQL语句的静 态部分和动态部分,而动态部分的变化是无限的,因此这样的SQL语句很难被缓存在shared pool里。毕竟内存是有限的,不可能把所有的动态部分都缓 存在shared pool里,即便能够缓存,管理这样一个无限大的shared pool也是不可能完成的任务。不使用绑定变量导致的直接结果就是,找到相同的SQL语句的概率很低,导致必须完整的解析SQL语句,也就导致消耗更多的资源。 从这里也可以看出,只有我们使用了绑定变量才能够更有效的利用shared pool。
相关阅读 更多 +