Chinaunix首页 | 论坛 | 博客
  • 博客访问: 572189
  • 博文数量: 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.如果内存块中没有了空闲的  就覆盖掉干净的数据块




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