1、缓冲区高速缓存的作用
buffer cache用于缓存数据块。数据块是我们在建库时定义的数据库的基本IO单位。建库时可以定义数据块大小,但是建库完成后不能修改,当时这个单个数据块大小不会影响太大性能。
show parameter block; --> db_block_size = 8192 --> 8K
buffer cache中缓存的就是来自数据库文件中的数据块。
select * from test; --> 涉及到test表的一个数据块,oracle实例会将test表对应的数据块从硬盘加载到内存,进行查询,将结果返回客户端。
update test set id=100 where name = 'zhangsan'; --> oracle实例会将zhangsan数据所在的数据块加载到内存,对buffer cahcae中的数据块进行修改,返回结果给客户端。
所以无论查询还是修改数据,都是先将数据所在的数据块加载到内存,然后执行查询/修改的操作
为什么不直接对硬盘进行修改操作?(1)进程直接修改硬盘上的数据,理论上是可以行的,但是对应数据库软件,需要定位到修改的行数据。(2)oracle实例将数据加载到内存中进行查询和修改以及oracle实际直接修改硬盘数据,这两个过程都涉及到内存中的实例和硬盘中的数据块进行交互。但是如果又有后续的操作涉及到相同的数据,则加载到内存中就不会再发生物理IO,直接写数据到硬盘需要发生再次的物理IO。所以如果再次修改的话,性能会变好。
总结:这个区域就是存放从硬盘加载到内存的数据块,使读取和修改数据都是在内存中完成。用于存放从数据文件读取的数据块副本,由所有并行用户共享。如果只是select大导致数据块被加载上来就是干净数据块,如果数据块又被修改过,则就是脏数据块。
目的:buffer cache是缓存数据块,能够提供和发生逻辑IO,提升数据库性能。
2、undo的作用
select查询会射到数据块的加载,这种情况下,数据块被加载到内存但是不进行修改,内存中的数据块就是硬盘数据库文件中数据块的副本。update涉及到数据块加载和修改,数据块刚刚被加载到内存时,和硬盘中数据库文件中的数据块一致,但是一旦修改,则产生脏数据(脏块)。
buffer cache中的脏块落盘,才能保证已修改数据的安全。但是脏块直接落盘性能很差,oracle中提出了使用redo来保证脏块数据安全。当update修改数据的操作执行完成后,数据块中的数据已经发生了变汉。
undo --> 保存已修改未提交的数据。这样做的目的是保证事务之间是隔离的。
内存 数据块 id=99 --> udpate操作 --> 数据块 id=100
--> undo id=99
在执行update语句的会话中事务未提交执行select查询,查看到的是数据块中当前值 --> id=100
在其他会话中进行select查询,查询到的都是undo中的快照值 --> id=99
undo的作用:(1)支持事务rollback
(2)RC undo解决了脏读问题
3、redo
redo重做日志 --> 一旦事务提交,则redo落盘,相较于脏块直接落盘,redo落盘性能更好
4、事务的隔离性
session1 会话1
session2 会话2
不同的隔离级别决定了事务之前的隔离性。
MySQL的隔离级别:
读未提交 RU 脏读 --> 读取到了未提交的数据
读已提交 RC 解决了脏读问题(undo),出现了幻读(读取其他事务已提交数据,inset引起
的)和不可重复读(读取其他事务已提交数据,update引起的),就是在另一
个会话中,同一个事务中前后select数据不一致
可重复读 RR 解决了欢度问题(间隙锁),解决了不可重复度问题(undo的MVCC),MVCC
是多版本并发控制,在undo中保存多个版本
序列化 串行执行事务,没有并发事务,不使用。
oeacle中也存在事务的概念,事务之前也应该存在隔离性,但是很少讨论oracle的隔离级别。
oracle的隔离级别:读已提交 RC(默认隔离级别,但是会存在幻读和不可重复度的问题)
序列化 串行执行事务,没有并发事务,不使用。
只读模式 只读模式的事务只能进行select操作,不能进行insert、update、
delete操作。
5、keep缓冲区池和pecycle缓冲区池
这个也是属于buffer cache中的一块区域,因为db缓冲区高速缓存buffer cache,当数据块加载到buffer cache满了之后,就要刷下去数据块,oracle中会将不用的数据块加载到keep缓冲区池中,如果keep缓冲区池中在不用的时候,就会被刷到pecycle缓冲区池中。如果要被替换数据块的话,就从pecycle缓冲池。这就叫二级缓存。
6、nK缓存区高速缓存
dbca建库后,一般数据块默认使用8K的数据块,8K的数据块加载到内存中,但是如果要加载16k的数据块,则会放到nk缓存区高速缓存中。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。