本文共 2056 字,大约阅读时间需要 6 分钟。
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手动进行验证
转载地址:http://xnncl.baihongyu.com/