最近拜读了梁老师的《收获不止oracle》,作为一个三四年的程序猿,算是第一次比较系统的去了解oracle体系结构这种偏底层的东西,
一般都是直接基于应用,用过可能就忘了。
这里做个相应的记录,也算是给自己学习的校验。
一条sql说下oracle体系结构:
select a from b where c=1
比如上面这句SQL,一般我们操作数据库,会通过sql plus连接数据库,或者直接通过plsql连接数据库。而你要连接上数据库,则需要通过给到你的账号
进行登录。
登录之后,数据库会在PGA(个人区域),也就是你个人的空间记录你的权限信息和你的连接会话信息等
当你执行sql时,oracle会给你的这个sql一个唯一的hashcode,根据这个hashcode去SGA(共享区域)的共享池找对应的hashcode,如果有的话,则找到该hashcode绑定的执行计划以及sql检查结果等数据,直接按照以前的步骤执行就好。如果没有对应的hashcode,则需要先进行sql语法检查,检查之后,进行sql解析。oracle会判断是通过走索引还是全表扫描的cost低,选择一个cost低的路线。
选择完毕,如走索引,先去SGA的数据缓冲区找对应的数据,如果没有,则需要去把数据库的数据文件的数据读到数据缓冲区。
这样,完成了一次sql操作。
下一次再执行这条sql时,因为已经有过一次操作了,所以再次执行直接那之前的数据读取就好了。
以上涉及了几个概念,
PGA:可以理解为个人会话空间
SGA:共享存储,里面包含了共享池,数据缓冲区,日志缓冲区等
数据文件:数据库存放了数据文件、日志文件等
++++++++++++++++++++++++++++
如果是一条update语句
++++++++++++++++++++++++++++
则需要多如下几步:
undo会记录事务,把更新前的数据存放到undo空间,等的用户的commit或者rollback操作