zoukankan      html  css  js  c++  java
  • oracle sql 执行原理

    oracle sql 执行原理

    select 的工作原理:
    1:Parse,语法分析阶段
    2:Execute,执行
    3:Fetch,提取数据阶段

    一:先在Library Cache找这条命令,看执行计划,
    二:如果没有,就语法分析
    三:如果语法通过,就对象分析,通过数据字典
           比如表存不存在,表列存不存在,表列如果是*,就翻译成全部列名
    四:获得对象解析锁,锁住表,列这个对象,目的是防止别的用户来改变表,列结构。
    五:检查权限对象,看用户能不能访问这个对象。比如表,视图。
    六:服务器生成执行计划,装载到Library Cache中
    七:检查数据库高速缓存区(Data buffer)中,有没有内容,即看能不能找到对象(表,视图)的数据块(block),如果有,就返回
    八:如果不存在,由服务器进程,把表块读取到Data Buffer中
    九:把Data Buffer中的数据提取出来.
     

    update语句分析:
    1:Parse阶段
    2:Execute阶段

    一:先在Library Cache找这条命令,看执行计划,
    二:如果没有,就语法分析
    三:如果语法通过,就对象分析,通过数据字典
           比如表存不存在,表列存不存在
    四:获得对象解析锁,锁住表,列这个对象,目的是防止别的用户来改变表,列结构。
    五:检查权限对象,看用户能不能访问这个对象。比如表,视图。
    六:服务器生成执行计划,装载到Library Cache中

    七:检查数据库高速缓存区(Data buffer)中,要修改的内容的行(数据块)存不存在,如果存在,就修改
    八:如果不存在,由服务器进程,把表块读取到Data Buffer中
    九:给被修改的行加锁,以防止其它用户对对象(表)的结构进行修改。
    十:旧数据放到Undo buffer(回滚段)中,新数据写时去,这个改变状态记录到Redo Logo中(Redo 日志/重做日志)

    删除(DELETE)
    1.Oracle读Block到Buffer Cache(如果该Block在Buffer中不存在)
    2.在redo log buffer中记录delete操作的细节
    3.在相应回滚段段头的事务表中创建一个undo条目
    4.把将要删除的记录创建前镜像,存放到Undo Block中
    5.在Buffer Cache中的相应数据块上删除记录,并且标记相应的数据块为Dirty


    提交(COMMIT)
    1.Oracle产生一个SCN
    2.在回滚段事务表中标记该事务状态为commited
    3.LGWR Flush Log Buffer到日志文件
    3.如果此时数据块仍然在Buffer Cache中,那么SCN将被记录到Block Header上,这被称为快速提交(fast commit)
    4.如果dirty block已经被写回到磁盘,那么下一个访问这个block的进程将会自回滚段中获取该事务的状态,确认该事务被提交。然后这个进程获得提交SCN并写回到Block Header上。这被称为延迟块清除(delayed block cleanout)。
     
     
    个人疑惑待解决问题
      对于insert into table1 (id) values(select max(id)+1 from table2) 这种sql,并发会不会引起id重复???
     
     

    合并连接(Sort Merge Join, SMJ):
      a) 对于非等值连接,这种连接方式的效率是比较高的。
      b) 如果在关联的列上都有索引,效果更好。
      c) 对于将2个较大的row source做连接,该连接方法比NL连接要好一些。
      d) 但是如果sort merge返回的row source过大,则又会导致使用过多的rowid在表中查询数据时,数据库性能下降,因为过多的I/O.

      嵌套循环(Nested Loops, NL):
      a) 如果driving row source(外部表)比较小,并且在inner row source(内部表)上有唯一索引,或有高选择性非唯一索引时,使用这种方法可以得到较好的效率。
      b) NESTED LOOPS有其它连接方法没有的的一个优点是:可以先返回已经连接的行,而不必等待所有的连接操作处理完才返回数据,这可以实现快速的响应时间。

      哈希连接(Hash Join, HJ):
      a) 这种方法是在oracle7后来引入的,使用了比较先进的连接理论,一般来说,其效率应该好于其它2种连接,但是这种连接只能用在CBO优化器中,而且需要设置合适的hash_area_size参数,才能取得较好的性能。
      b) 在2个较大的row source之间连接时会取得相对较好的效率,在一个row source较小时则能取得更好的效率。
      c) 只能用于等值连接中

  • 相关阅读:
    【转载】SAP_ECC6.0_EHP4或SAP_ECC6.0_EHP5_基于Windows_Server_2008R2_和SQL_server_2008下的安装
    使用delphi 开发多层应用(二十四)KbmMW 的消息方式和创建WIB节点
    使用delphi 开发多层应用(二十三)KbmMW 的WIB
    实现KbmMw web server 支持https
    KbmMW 服务器架构简介
    Devexpress VCL Build v2014 vol 14.1.1 beta发布
    使用delphi 开发多层应用(二十二)使用kbmMW 的认证管理器
    KbmMW 4.50.00 测试版发布
    Basic4android v3.80 beta 发布
    KbmMW 认证管理器说明(转载)
  • 原文地址:https://www.cnblogs.com/luluQQ/p/3770293.html
Copyright © 2011-2022 走看看