Oracle执行SQL语句的过程
转载至:http://blog.csdn.net/aqszhuaihuai/article/details/7024551
当我们提交一条sql语句时,Oracle会做哪些操作呢?
Oracle会为每个用户进程分配一个服务器进程:service process(实际情况应该区分专用服务器和共享服务器),当service process接收到用户进程提交的sql语句时,服务器进程会对sql语句进行语法和词法分析。
名词解释:
语法分析:语句本身正确性。
词法分析:对照数据字典中检查表,索引,视图和用户权限。
检查通过后,服务器进程会将sql语句转变为ascii码,并通过一个hash函数将ascii码生成出一个hash值,服务器进程会到share pool中查询此hash是否存在,如果存在,服务器进程会从share pool中读取已经解析好的语句来执行;如果不存在,则需要做以下步骤:生成执行计划和生成执行编码(请理解何为执行计划)。解析完成后,Oracle会将sql语句本身代码、hash值、编译代码、执行计划和所有与该语句相关的统计数据存放到share pool中。
注意:
1 尽量写相同的sql语句,因为即使是from语句中table顺序的变化、查询字段位置的变化,甚至只是大小写的不同,都会促使oracle重新做一次硬解析。
2 增大shared_pool_size可以保留更多的缓存在内存中的sql语句执行计划,也意味着共享sql的可能性的增大。
在生成编译代码后,service process会试图从db_buffer中读取是否存在相关的缓存数据。
下面我们分两种情况来说明:
1 db_buffer中不包含内存数据:service process会首先在表的头部请求一些行锁,申请成功后,将这些行所在的第一个block读入db_buffer。此时如果db_buffer空闲空间不足,则会触发写操作—DBWr。如果db_buffer剩余的空间不够存储新数据,就会触发DBWr进程,将db_buffer中脏数据写入数据文件。腾出来的空间写入新数据。
注意: db_block是oracle最小的逻辑单位,即使我们所要求的数据只是一个block所包含的众多行中的一行或几行,我们仍然需要将整个block读入db_buffer。db_block的大小可以设置为8k的整数倍,并且可以针对不同的表空间设置不同的db_block_size的大小,一般建议在select多的表上将db_block_size设置大一些,而dml操作多的表上设置的小一些。
2 DBWr是写数据进程,触发DBWr进程的事件除了db_buffer空间不够外,ckpt进程也是触发DBWr的事件。
补充:
1 段是oracle最小的拓展单位。
2 ckpt进程:检查点进程。将scn写入日志文件,控制文件,数据文件头,数据块头部。触发ckpt进程的事件有alter system checkpoint,alter tablespace offline/begin back up和正常shutdown数据库。
3 scn:system change number或者使用system commit number。scn号是oracle的逻辑时钟标志,我们可以理解为在commit时才会发生变化。Scn号是维持数据一致的重要标志,oracle实现备份恢复的数据一致性就是通过scn来判断。
block读入db_buffer后,service process会将这个块头部的SCN号和发生变更的行数据写入回滚段。当用户或者oracle回滚数据时就是通过回滚段和当前数据块实现数据的往前回滚。
解释:
回滚段是用来保存修改数据的前映像数据的,作用是保持并发操作时的读一致性,实现回滚等。回滚段过小会引发快照过旧错误。9i提供了专门的undo表空间,显然如果表空间级别的调整大小要比调整回滚段容易的多。
注意:
Insert操作:回滚段只需要记录rowid,如果回退,只需将该记录根据rowid删除即可;
Update操作:回滚段只需要记录发生变化的字段的前映像值,回滚时用前映像值覆盖更新值即可;
Delete操作:回滚段记录整行的数据,回滚时恢复整行数据;
做imp/exp或者大批量事务处理时,需要为当前事务创建一个大的回滚段,并将其他回滚段offline。
接着oracle会生成日志,server process会将被修改的数据的rowid、修改前的值、修改后的值、scn信息和回滚段中的相关信息写入redo log buffer,当发生以下操作时,LGWr会将redo log buffer中的数据写入磁盘上的online redo:时间超过3s、占用redo log buffer空间超过1/3、检查点进程、alter switch logfile和DBWr进程之前。
注意:
1 oracle中写数据的顺序为:1 读入db_buffer;2 写回滚段;3 写redo log buffer;4 改写db_buffer;5 写日志文件;6写数据文件;
commit并不会触发DBWr进程,即不会写入数据,commit只会触发写日志操作和写入scn号。但是任何的dml语句都会产生日志。
当一个联机日志文件写满后,LGWr会写入下一个联机日志,请记住联机日志是循环写,而控制文件是并发写。如果设置了为归档模式,归档进程会将前一个联机日志写入归档文件。
2 db_buffer中包含内存数据:首先判断用户执行的操作类型。
Select操作:首先判断db_buffer中的数据块头部是否存在事务,如果有,则说明数据块中的数据正在被事务处理,回滚段中存储着该数据的前映像,server process利用回滚段中的数据进行读一致性重构;如果数据块头部不存在事务,则有可能该数据已经被事务处理完毕但仍然留在db_buffer中,这时会比较select语句中scn号和db_buffer中的数据块头部的scn号,前者小于后者则说明此数据已经发生更改,处理数据同上,如果前者大于等于后者,则该数据为非脏数据,直接读取即可。
Update操作:无论数据块头部是否存在事务,又或者scn号之间孰大孰小,都需要服务器进程到表的头部申请行锁,申请成功则继续操作,不成功则等待加锁直至成功。
Oracle执行SQL语句的过程的更多相关文章
- 跟踪oracle中sql语句运行过程及相关知识拓展
select * from v$sqlarea; select * from v$sqlarea where first_load_time>'2010-11-27/09:30:00'; 这种方 ...
- 转:Oracle中SQL语句执行过程中
Oracle中SQL语句执行过程中,Oracle内部解析原理如下: 1.当一用户第一次提交一个SQL表达式时,Oracle会将这SQL进行Hard parse,这过程有点像程序编译,检查语法.表名.字 ...
- Oracle执行SQL查询语句的步骤
Oracle执行SQL查询语句的步骤 如果用户在SQL*Plus下输入了如下查询语句:SELECT * FROM dept: 查询语句的处理主要包括三个过程:编译(parse).执行(execute) ...
- oracle常用SQL语句(汇总版)
Oracle数据库常用sql语句 ORACLE 常用的SQL语法和数据对象一.数据控制语句 (DML) 部分 1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, ...
- oracle 常用sql语句
oracle 常用sql语句 1.查看表空间的名称及大小 select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_sizefrom d ...
- Oracle和SQL语句的优化策略(基础篇)
转载自: http://blog.csdn.net/houpengfei111/article/details/9245337 http://blog.csdn.net/uniqed/article/ ...
- JDBC进阶之PreparedStatement执行SQL语句(MySQL)
一.什么是PreparedStatement 参阅Java API文档,我们可以知道,PreparedStatement是Statement的子接口(如图所示),表示预编译的 SQ ...
- oracle 中SQL 语句开发语法 SELECT INTO含义
oracle 中SQL 语句开发语法 SELECT INTO含义 在ORACLE中SELECT INTO是如何使用的,什么意思?和SQL SERVER的不一样? 和sqlserver的不一样sql ...
- Entity Framework Code First执行SQL语句、视图及存储过程
1.Entity Framework Code First查询视图 Entity Framework Code First目前还没有特别针对View操作的方法,但对于可更新的视图,可以采用与Table ...
随机推荐
- ios Https问题
HTTPS认证过程: ① 浏览器发送一个连接请求给安全服务器. ② 服务器将自己的证书,以及同证书相关的信息发送给客户浏览器. ③ 客户浏览器检查服务器送过来的证书是否是由自己信赖的 CA ...
- Visual studio 2017编译 boost
下载: https://www.boost.org/ 或者 https://dl.bintray.com/boostorg/release/1.66.0/source/ 下载完成以后解压到自己想要 ...
- DSOframer 的简单介绍和资源整理(2015-09-02重新整理)
DSOframer 是微软提供一款开源的用于在线编辑 Word. Excel .PowerPoint 的 ActiveX 控件.国内很多著名的 OA 中间件,电子印章,签名留痕等大多数是依此改进而来的 ...
- Android UI 之 ListView
一.在代码中创建(不适用XML布局文件) 1.创建一个项目:ListViewLearn 2.修改MainActivity,继承于ListActivity 3.创建一个String数组,用来保存List ...
- IntricCondition和expliciteCondition比较
IntricCondition 和 expliciteCondition 的区别 与 intrinsicLoc和expliciteLock的区别很相似, expliciteCondition提供了更多 ...
- B-spline Curves 学习之B样条曲线性质(5)
B-spline Curves: Important Properties 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习. ...
- B-spline Curves 学习之B样条曲线定义(4)
B-spline Curves: Definition 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习. (原来博客网址:h ...
- hdu 4281 Judges' response(多旅行商&DP)
Judges' response Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 浅议Github的注册和使用
Self-introduction:编者本人叫司明周,现就读于南通大学计算机学院网络工程142班.爱好数学和音乐,喜欢数学中的逻辑性和天马行空的思维 编程能力:可以跳过略过得过且过吗..好吧,面对现实 ...
- eayui js动态加载Datagrid,自适应宽度,高度
HTML: <div class="easyui-layout" style="min-height:100%;min-width:100%;"> ...