第1章 oracle的体系结构(二)

11. Oracle执行SQL查询语句的主要步骤。

        SQL语句主要由用户进程和服务器进程完成。其他一些进程辅助完成。

        查询语句的处理主要包含3个阶段:编译(parse)、执行(execute)、提取数据(fetch)。

        1)编译:在进行编译时,服务器进程会将SQL语句的正文放入共享池(shared pool)的库高速缓存(library cache)中并将完成以下处理。

  • 首先在共享池中搜索是否有相同的SQL语句(必须要完全相同,比如sql*plus中是使用&绑定变量的方式或者java中sql语句用?代替变量,以保证传入不同的变量,但执行的sql相同。),如果没有就进行后续的处理。
  • 检查该SQL语句的语法是否正确。
  • 通过查看数据字典来检查表和列的定义。
  • 对所操作的对象加编译锁(parse locks),以便在编译语句期间这些对象的定义不能被改变。
  • 检查所引用对象的用户权限。
  • 生成执行该SQL语句所需的优化的执行计划(执行步骤)。
  • 将SQL语句和执行计划装入共享的SQL区。

以上每一步操作都是在处理正确时才进行后续处理。如果不正确,就返回错误。

        2)执行(execute):Oracle服务器进行开始执行SQL语句。它已获得了执行SQL语句所需的全部资源和信息。

3)提取数据(fetch):Oracle服务器进程选择所需的数据行,并在需要时将其排序,最后将结果返回给用户(进程)。

12.Oracle实例的系统全局区(SGA)

13.Oracle执行UPDATE语句的步骤。

与执行查询语句有所不同,Oracle在执行DML语句时只有编译和执行两个阶段。步骤如下:

  • 如果数据和回滚数据不在数据库高速缓冲区,则Oracle服务器进程将吧它们从数据文件中读到数据库高速缓冲区中。
  • Oracle服务器进程在要修改的数据行上加锁(行一级的锁)。
  • Oracle服务器进程将数据的变化信息和回滚所需的信息都记录在重做日志缓冲区中。
  • Oracle服务器进程将回滚所需的原始值和对数据所做的修改都写入数据库高速缓冲区。之后在数据库高速缓冲区中对所有的这些数据块都将被标记为脏缓冲区,因为此时内外存的数据是不同的(不一致的)。

 Oracle处理insert或delete语句的步骤与处理update语句步骤大体相同。

14.怎么设置内存缓存区的大小?

        在Oracle 9i之前版本,SGA相关参数是静态的,即修改完初始化参数文件后,必须重新启动Oracle数据库才会生效。

        在Oracle 9以后的版本中,SGA为动态的。SGA中的database buffer cache和shared pool 等都可以动态地增加和减少。Oracle是通过黎勇所谓的区组(granule)来管理SGA的内存的。区组(granule)就是一片连续的虚拟内存区,是Oracle分配和回收内存区的基本单位。

        区组的大小取决于所估计的SGA的大小。如果SGA的尺寸大于或等于128MB,则区组的大小就为16MB。SGA至少包括3个区组:一个是SGA固定区(其中包含了重做日志缓冲区);一个是数据库高速缓冲区;一个是共享池。

        Oracle数据库管理员可以通过alter system set命令来分配和回收区组。但总的内存大小不能超过SGA_MAX_SIZE所设定的值。该参数的单位是字节。

        动态分配和回收最大的优点是调整后不需要重新启动数据库。

15.怎么获取内存缓冲区信息?

1)使用命令 “show parameter ”获取参数SGA_MAX_SIZE的值。这个显示的信息太多了,不方便查看。

2)使用命令“show sga”查看。

 3)使用数据字典v$parameter查看参数SGA_MAX_SIZE的值。

select name,type,value from v$parameter where name='sga_max_size';

16.重做日志写进程的工作原理。

         重做日志写进程(LOG writer,LGWR)负责将重做日志缓冲区(内存)的记录顺序地写到重做日志文件(硬盘)中。上面说的是这个进程做了什么。那么具体是怎么做的呢?

        Oracle服务器使用了一种称为快速提交(fast commit)的技术,该技术既能保证Oracle系统的效率又能保证在系统崩溃的情况下所有提交的数据可以得到恢复。为此Oracle系统引入了系统变化数(system change number,SCN)。无论任何时候只要某个事务(transaction)被提交,Oracle服务器都将产生一个SCN(号码)并将其赋予该事务的所有数据行。Oracle内部时间截作为SCN,保证其单调递增,且唯一。

        发送commit语句后,Oracle的内部操作步骤:

  • 服务器进程将把提交的记录连同所产生的SCN号码一起写入重做日志缓冲区中。
  • 重做日志写进程(LGWR)将把重做日志缓冲区中一直到所提交的记录(包括该记录)的所有记录连续地写到重做日志文件中。在此之后,Oracle服务器就可以保证即使在系统崩溃的情况下所有提交的数据也可以得到恢复。
  • Oracle通知用户(进程)提交已经完成。
  • 服务器进程将修改数据库高速缓冲区中的相关数据的状态并释放资源和打开锁等。

 此时可能这些数据并未被写到数据文件中,这些数据缓冲区被标位脏缓冲区,因为相同的数据在内存和外存中为不同的版本。数据库高速缓冲区中的数据是由DBWR写到数据库文件中的。

(我的理解:脏缓冲区在DBWR写入到数据库文件前,数据库文件(外存)中为旧版本,内存脏缓冲区的为新版本,此时要是系统崩溃了,内存中的新版本数据丢失了,需要SMON进程读取重做日志文件数据(新版本数据)来更新外存的旧版本数据。)

注意:只有在重做日志数据写到重做日志文件(磁盘)上时才能确定提交已经完成。即上面的第二步完成,才算事务提交完成。

LGWR要在下列情况下将重做日志缓冲区的记录(内存)顺序地写到重做日志文件(外存)中:

  • 当某个事务被提交时。
  • 当重做日志缓冲区中变化的记录超过1MB时。
  • 当重做日志缓冲区中所存在的记录已超过缓冲区容量的1/3.
  • 在DBWR将数据库高速缓存区中修改过的数据块写到数据文件之前。
  • 每3秒钟。

我的理解:上面这些情况应该只供参考,主要是为了最大限度的利用有限的资源。

日志挖掘工具:logminer  和 日志挖掘浏览器(logminer viewer)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值