Chinaunix首页 | 论坛 | 博客
  • 博客访问: 547971
  • 博文数量: 159
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 1264
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-20 14:15
个人简介

LoveMoney

文章存档

2016年(2)

2015年(8)

2014年(148)

2011年(1)

分类: Oracle

2014-05-27 13:10:14

10.SQL语句执行过程

select * from dba_data_files;
1.客户端输入SQL语句
  SQL语句通过网络到达数据库实例
ServerProcess接受SQL语句 Oracle认识SQL语句,但是不能直接执行,需要解析
A.SQL--被解析生成执行计划,然后Oracle才能执行
B.解析:判断SQL语法-->SQL涉及的表和视图是否存在/SQL所访问的一些表和视图是否有权限-->判断如何去执行(通过访问各种资源作出判断,找出最优的执行方案)-->生成执行计划
 解析会消耗很多资源【CPU(主要)、IO】 执行计划会缓存(放在Shared Pool),如果生成的执行计划在缓存中找到了,直接从缓存中执行

Server Process去(1.找shared pool是否存在SQL对应的执行计划),不存在就(2.对SQL语句进行解析)

C.执行计划执行的时候就去取数据
D.serverp rocess根据执行计划去执行,从dbf文件中取出数据并返给用户
D-1.Server process从buffercache中去找数据,如果有,直接从buffer cache中取出并返给用户(产生逻辑IO)
D-2.如果buffer cache中没有所需数据,就从dbf中找到(1次物理IO),并存放到buffer cache中,从buffercache中返给用户(1次逻辑IO)。

逻辑IO  从内存里读
物理IO  从磁盘上读

命中率: 缓存中
命中率=L/(L+P) 逻辑读/(逻辑读+物理读)

逻辑读99/(逻辑读99次+物理读1次)=99%

命中率低肯定有问题
命中率=10W/11W 物理读1W 逻辑读10W 所以命中率高并不一定没问题!

vmstat  iostat

tps    每秒传输次数
Blk_read/s  每秒读物理块数

2.修改数据 DBWR
server process在内存中对oracle表进行的任何修改,都会产生日志,并写入到redo buffer
(server process进程只负责读,反馈给用户,给用户的感知很快)
优化:从server process下手,看那个server process快,那个慢
DBWn进程将内存中被修改后的数据写入到数据文件中,LGWR将redo buffer中的数据写入到日志文件中

3.检查点进程 CKPT 周期进行,把数据库当前的一些状态信息写到控制文件和数据库文件头部
较轻松

4.系统监控进程 SMON 对数据库内部进行清理(主内)
对共享池的碎片进行整理

5.进程监视进程 PMON 对server process进程进行清理,清理PGA(主外)

6.归档进程 ARCn
默认3组log文件

7.缓冲区的数据状态
已连接
干净
空闲或未使用

 在内存中的状态
  A.从dbf读到内存  干净的
  B.被serverprocess锁定(进行读或写的瞬间) 已连接 (pin住)
  C.被修改后的数据  脏的
  D.再从dbf读第二个数据  优先使用干空闲的内存块
  E.如果内存块中没有了空闲的  就覆盖掉干净的数据块




阅读(1307) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~