oracle系统学习之物理体系
Oracle体系结构学习
学习一门技术,首先要了解其体系结构。体系结构是对一个系统的的框架描述,是设计一个系统的宏观工作,就如建一座大楼需要设计图纸一样。按照图纸建筑师可以建造一座可靠的大楼,也可以依据图纸来找到每一个功能部件。同样,我们平时遇到的与数据库相关的问题,很多都可以从体系结构中找到解决方法,因此理解体系结构至关重要。
下图是一张oralce体系结构图:
一、理论知识
1、Oracle服务器是由实例(instance)和数据库(database)组成
要访问数据库,必须先启动实例,实例启动时,先分配内存,再启动后台进程。
2、实例是由一个共享内存区SGA(System Global Area)和一系列后台进程组成的,其中SGA主要包含共享池(shared pool)、数据缓存区(db cache)和日志缓存区(log buffer)组成
共享池是为了共享SQL代码,即把解析得到的SQL代码的结果在这里缓存和共享,共享池包括库高速缓存和数据字典高速缓存
数据缓存区存储了最近从数据文件读取的数据或用户更改后需要写回数据库的数据
3、数据库是由数据文件、参数文件、日志文件、控制文件和归档日志文件等一系列文件组成
4、PGA(Program Global Area),这个内存区是私有的,它是由操作系统在本地分配的,存储了用户的连接信息和权限等信息,它随着服务器进程的创建而被分配内存,随着进程的终止而释放内存。
二、实践探索
1、查询数据
如查询SQL语句:select * from msecusrdef where user_id='007';
当用户发出这条SQL语句后,该SQL语句先从1区PGA做准备工作,该SQL指令会匹配唯一的hash值(类似我们的身份证号码),然后该SQL指令进入2区SGA进行处理。首先登门拜访SGA的共享池,按照hash查看共享池内是否有这个SQL指令,如果没有,这个hash值就会被存储下来了,开始验证该SQL语句语法是否正确、是否有权限等,然后解析SQL语句(通过执行计划估算走索引和全表扫描的代价),确定最小代价(如走索引),如果有的话,则跳过这些步骤。接着该SQL语句像个钦差大臣一样手持“按索引读取某某数据”的圣旨,去数据缓存区宣读圣旨,数据缓存区接受圣旨后,立即按照user_id列上的索引从msecusrdef查找user_id为007的数据,如果找到,就传达给钦差大臣,如果找不到呢,只能八百里加急到偏远的3区查找,再把结果带回数据缓存区,传达给钦差大臣。
接下来,我们实际执行这个SQL语句看下效果
set autotrance on 是跟踪SQL指令的执行计划和执行的统计信息
set timing on 是跟踪该语句执行完成的时间
下图为第一次执行的结果
接下来再执行一次:
该SQL语句前后被执行了两次,对比两次的输出结果,我们可以看到,第二次的执行时间更短,第二次没有产生递归调用(recursive calls)和物理读(physical reads)。
原因就在于:
a.首次执行该SQL指令,该指令从磁盘中获取用户连接和权限信息,并保持在PGA内存里,第二次执行时,因为同一个会话,用户连接和权限就可以从PGA内存中直接获取,避免了物理读。
b.首次执行该SQL指令结束后,SGA内存区的共享池中保存了该SQL指令的hash值,并保存了语法语义检查和执行计划等解析动作的成果,第二次执行时,由于该SQL指令的hash值在共享池中存在,所以之前的硬解析动作就不需要了
c.首次执行该SQL指令时,数据一般不在SGA的数据缓存区内,只能从磁盘读写,产生物理读,获取数据后会保存在数据缓存区中,所以第二次执行时,直接从数据缓存区中获取,避免了物理读。
2、更新语句
上面三点更新语句和查询语句是一样的,差异就在于做完这三步之后,查询语句把数据返回给用户就收工了,而更新语句还要加班,这就要涉及到DBWR进程了。更新SQL指令在数据缓存区内修改完数据后,COMMIT后,会启用DBWR进程,完成更新的数据从内存写入磁盘。(这里需要强调一点,commit后,由CKPT进程决定何时启用DBWR进程将数据缓存区的数据写入磁盘,不是立马写入,而是累积到一定的程度,由CKPT进程触发DBWR进程把数据批量写入磁盘)日志缓存区保存了数据库操作的日志(记录了这个更新动作),commit时由LGWR进程将其从日志缓存区写入磁盘的REDO日志文件。(目的是为了方便以后出现异常情况时,可以根据日志文件记录的动作再执行一遍)
归档日志和日志文件:比如4个日志文件都写满的时候,该怎么办呢?这个时候采取的是先把日志文件1的数据备份出去,再覆盖重写。ARCH进程就是在LGWR进程写日志写到需要覆盖已满的日志文件时,将日志文件复制出去形成归档日志文件,再以此类推。这些归档日志文件也需要定时转移到新的存储介质中,这个存储介质中的ARCH文件就是将来数据库故障时用来恢复数据的法宝了。
参考书目:《收获,不止Oracle(第2版)》,作者:梁敬彬,梁敬弘,电子工业出版社出版