Oracle体系结构

Oracle在在线事务处理上比较强
内存IO能力200倍于普通磁盘
select * from emp where empno=:1 绑定变量 通过hash value
有索引走索引,无索引走全表扫描
执行计划会计算总成本,选出执行计划最低的
Shared pool到library cache
1)语句找出 从library cache找出最优的执行计划,找出这条语句
2)对象失效 原先表上有100条数据,表上的数据没有变化,继续执行全表扫描
如果表上的数据增加到了100万条,那么执行计划会改变
3)并发控制 有些票务系统会用到
Library cache中缓存了数百万条记录,如何从中找出这条语句的执行计划,11g里面的SQL语句区分大小写,hash每个字母转化为ASCII码,进行hash运算
用hash value定义SQL语句
数据表用lock控制并发
1)计算hash
3个SQL都是相同一个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
数据字典cache,data dictionary cache主要用来做硬解析时候用
还有一个叫软软解析,在library cache执行完软解析后,会有一个指针直接指向heap6,就是代表软软解析
UGA 放在PGA
session cached cursor
library cache 的heap6 指针指向heap6
可以参考dsi文档

读不阻塞写,但写会阻塞读
当B块正在写的时候,如果A块要去读B块的内容,是无法读的,需要等到
产生了buffer busy waits的等待事件,DML语句产生等待
检查点事件
checkpoint
数据库操作在内存中完成,把数据文件读到内存中去,3000到5000

理想情况下,要在断电前把5000写入磁盘,保证数据不丢失
5000;执行commit,代表事务结束
只要commit就把数据写入磁盘,同步写,效率低,性能差。8k一个数据块
但是数据库同步写入磁盘速度太慢。
现在是如果系统重启完了,数据库在启动时候把数据重新构造出来,数据块用异步来写
只写日志,日志先行,commit,先把日志写入磁盘,数据块缓行。

把上面的1、2、3、4用DBWr写入下面的磁盘内
DBWr负责写脏块,3秒一写,充满1/3空间一写,DBWr把1、2、3、4写回磁盘,DBWr去把原先内存中移除掉已经写回到磁盘里面的1、2、3、4日志
checkpoint进程监控数据文件同步
把当前状态写入控制文件,刚好把日志4写入了磁盘,如果实例挂了,就从日志4开始恢复

Database buffer cache内存空间总要用完
3秒内BCH就会增加1
会把BCH数值小的清除掉
Shared pool做解析,到database buffer cache取数据,database dictionary cache用来做硬解析
Redo log buffer日志先进,先进内存,commit,lgwr写入日志到磁盘
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
Spm:SQL plan baseline
把SQL语句放入baseline

当第二个accept变成了yes,才会从两个accept中间进行选择
1. sql tunning advice 验证,数据库自动运行
会从两个accept的yes中进行选择
2. envolve 手动进行验证