oracle 11g 体系结构研究

Oracle体系结构


Oracle在在线事务处理上比较强

内存IO能力200倍于普通磁盘

select * from emp where empno=:1   绑定变量    通过hash value

有索引走索引,无索引走全表扫描

执行计划会计算总成本,选出执行计划最低的

Shared poollibrary cache

1)语句找出 从library cache找出最优的执行计划,找出这条语句

2)对象失效 原先表上有100条数据,表上的数据没有变化,继续执行全表扫描

         如果表上的数据增加到了100万条,那么执行计划会改变

3)并发控制 有些票务系统会用到

Library cache中缓存了数百万条记录,如何从中找出这条语句的执行计划,11g里面的SQL语句区分大小写,hash每个字母转化为ASCII码,进行hash运算

hash value定义SQL语句

 

数据表用lock控制并发

1)计算hash 

3SQL都是相同一个emp表,但是归属于不同的schema,那么就会出现3个是一样的hash value,但是确是不同的执行计划。

上图的横线就是软解析的整个等待过程,产生的等待事件是latch library cache

从上到下依次是父游标和子游标

增加mutex锁,为了缩短链表长度,提高检索速度

找到父游标的mutex,找到父游标获取mutex,再找到执行计划。

出现mutex等待事件,说明SQL语句版本过多

硬解析

先获取latch,发现没有,释放latch,再申请latch shared pool,获得chunk内存


语法解析 语义解析 表上数据分布  有无索引

 

硬解析多,会有等待事件:

latch library cache

latch shared pool

 

数据字典cachedata dictionary cache主要用来做硬解析时候用

还有一个叫软软解析,在library cache执行完软解析后,会有一个指针直接指向heap6,就是代表软软解析

UGA 放在PGA

session cached cursor

library cache heap6 指针指向heap6

可以参考dsi文档


读不阻塞写,但写会阻塞读

B块正在写的时候,如果A块要去读B块的内容,是无法读的,需要等到

产生了buffer busy waits的等待事件,DML语句产生等待

 

检查点事件

checkpoint

数据库操作在内存中完成,把数据文件读到内存中去,30005000


理想情况下,要在断电前把5000写入磁盘,保证数据不丢失

5000;执行commit,代表事务结束

只要commit就把数据写入磁盘,同步写,效率低,性能差。8k一个数据块

但是数据库同步写入磁盘速度太慢。

现在是如果系统重启完了,数据库在启动时候把数据重新构造出来,数据块用异步来写

只写日志,日志先行,commit,先把日志写入磁盘,数据块缓行。



把上面的1234DBWr写入下面的磁盘内

DBWr负责写脏块,3秒一写,充满1/3空间一写,DBWr1234写回磁盘,DBWr去把原先内存中移除掉已经写回到磁盘里面的1234日志

checkpoint进程监控数据文件同步


把当前状态写入控制文件,刚好把日志4写入了磁盘,如果实例挂了,就从日志4开始恢复



Database buffer cache内存空间总要用完

3秒内BCH就会增加1

会把BCH数值小的清除掉

Shared pool做解析,到database buffer cache取数据,database dictionary cache用来做硬解析

Redo log buffer日志先进,先进内存,commitlgwr写入日志到磁盘

Large pool:对磁盘操作要做内存缓冲,IO操纵,内存缓冲区在large pool定义,如果没有设置large pool会导致在RMAN恢复的时候导致数据库性能下降,因为RMAN恢复会消耗IO资源,导致占用shared pool资源,使数据库性能下降。

dbms_mview.explain_rewrite物化视图不能查询重写在这里都能看到

 

一个表,如果多列数据无关联,执行计划正确,如果出现多列数据相关,会导致数据库的执行计划有偏差,需要增加虚拟列来进行修复

多列统计信息和索引无关

收集统计信息

exec dbms_stats.gather_table_stats(‘scott’,’T1’,’CASCADE=>TRUE);

数据库采用哪个执行计划?

Profile优于spm,先profile,再spm

SpmSQL plan baseline

SQL语句放入baseline


当第二个accept变成了yes,才会从两个accept中间进行选择

1.      sql tunning advice 验证,数据库自动运行

会从两个acceptyes中进行选择

2.      envolve 手动进行验证

 

 



请使用浏览器的分享功能分享到微信等