ITPub博客

首页 > 数据库 > Oracle > 剖析SQL语句的执行过程

剖析SQL语句的执行过程

原创 Oracle 作者:dayong2015 时间:2014-06-06 17:20:23 0 删除 编辑

在Oracle数据库系统架构下,SQL语句由用户进程产生,然后传到相对应的服务器端进程,之后由服务器进程执行该SQL语句,如果是select语句,服务器进程还需要将执行结果传给用户进程。
SQL语句的执行过程一般如下:
解析(PARSE)—— 绑定(BIND)——执行(EXECUTE)——提取(FETCH 只有SELECT才需要这步)
通过一条select语句大致解析过程:
客户端输入一条select语句,用户进程通过网络传输送入shared pool,shared pool中的server process进程接收这条select语句,server process首先会检测shared pool中是否缓存该sql语句和相应的执行计划,如果没有,那么server process将用户输入的sql语句转化为ASSIC值,然后根据hash函数计算出其对应的hash值,server process将计算出的hash值去library cache中找到对应的链,然后遍历chunk是否存在。
1.如果不存在,获得shared pool latch(共享锁),然后在shared pool中的可用chunk链表上找到一个chunk,之后释放shared pool latch,接下来,就是进行硬解析过程,步骤如下:
1)对sql语句进行语法检查,如果有,退出解析。
2)对数据字典里校验sql语句涉及的对象和列是否存在。如果不存在,则退出解析过程。这个过程会加载data dictionary cache(数据字典缓存)。
3)将对象进行名称转化。比如将同义词翻译成实际的对象等。如果转化失败,退出解析。
4)检查发出sql语句的用户是否具有访问sql语句里所引用对象的权限。若没有,退出解析。
5)通过优化器创建一个最优的执行计划。这个过程会根据数据字典记录的对象的统计信息,来计算最优的执行计划。这是最耗CPU资源的。
6)将游标所产生的执行计划、SQL文件等装载进library cache的heap(堆栈)中。
2.如果在shared pool的链上找到了对应的chunk,则说明该sql语句之前运行过,于是进行软解析,步骤如下:
1)server process将之前计算出的hash值送入DB cache中是否有该sql语句的缓冲数据块。
2)如果找到了对应链上的chunk,那么server process会将之前缓存的执行结果返回给前台用户。
   如果没有找到对应链上的chunk,会去磁盘中取数据,然后先将数据缓存在DB cache中,然后server process将DB cache中缓存的结果输出到前台用户。

现通过其他DML语句,如update语句的解析过程,如下:
此处只分析执行update语句和执行select语句的一些不同之处:
1.当一条update语句被server process送入DB cache中,找到了其对应链后会获得cache buffers chains闩锁来保护hash链的数据结构(会一直占有此闩锁,直到该会话执行了commit或rollback)。如果没有足够多的DB cache空间,LRU链会通过TCH计数器来判断某个数据块是否为热块,当会话在LRU链上分配缓存时,先从LRU链的冷端开始查找,如果查到某个非脏的缓冲区是热块(根据TCH值的高低判断是否为热块),就会跳过这个热块继续向下查找,知道分配DB cache空间。(在commit或rollback之前,更新之前的数据会存放于undo表空间,默认保存900秒)
2.对DB cache中数据执行完更新操作后,将操作成功的结果返回给用户。当DB cache空间不足时,DBWR进程会将缓冲区中的脏数据写入磁盘,然后释放空间。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29634949/viewspace-1177184/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: ORACLE后台进程
请登录后发表评论 登录
全部评论

注册时间:2014-04-29

  • 博文量
    78
  • 访问量
    790445