Oracle体系结构2
Buffer Cache
作用:缓存dbf中的数据
例子:A和B重复访问同一张表的几率是很大的,如果每次访问dbf时都要发生物理IO,这样会导致数据库的性能非常低
由于这个例子,当一个进程访问dbf时,Server Process首先会去buffer cache找表中的数据,如果数据存在,直接从Buffer cache中读取返回客户端,反之,如果数据不存在,则会从dbf中找,从dbf中将数据取出来放入buffer cache,然后在从buffer cache中进行读取。
重点:Server Process读取数据时,先去寻找的是Buffer cache
逻辑IO与物理IO
逻辑IO---逻辑读:Server Process直接从buffer cache读取数据(内存读)
物理IO---物理读:Server Process从磁盘上读取数据 (磁盘读)
逻辑读大于物理读,进而可以提高数据库的读速度
命中率
L/L+P 逻辑读/逻辑读+物理读
命中率高:逻辑读多,物理读少---较好
命中率低:逻辑读少,物理读多
命中率低,数据库一定有问题,但是命中率高也不一定没有问题
例子:假设L=90000 P=10000 那么命中率=90000/90000+10000,这里的L与P都很高,但是P高导致服务器性能变慢,所以命中率高也不一定好
总之需要综合命中率与物理读两项来判断好与坏
Server Process
Server Process修改某个数据的时候,首先将表中所需要的数据读入buffer cache,Server Process在内存中对表进行修改,在修改的时候会产生日志,而日志会写进redolog buffer中,此时内存中的数据与dbf中的数据是不一样的。
Server Process主要负责读出数据到内存,在内存中修改数据,将产生的日志写到Redolog buffer中,并不负责将修改后的数据写回磁盘,也不负责将日志写回磁盘
SQL语句执行流程
SQL--->Server Process--->解析--->执行计划--->取数据
后台进程
后台进程的特点:用户无感知
注意:数据库的优化重点在于Server Process,因为Server Process反应速度将代表数据库的运行速度
不管后台进程有多忙,只要serverprocess快速轻松,用户就会感到快速轻松,用户就会感到数据库很快,可能这时后台进程非常的繁忙,这是我们理想的一个结果。
(1)DBWn---将内存中的数据写回dbf(磁盘)
(2)LGWR---将redolog buffer中的日志写到日志文件中
(3)检查点进程---周期性的进行,把数据库的状态信息写到控制文件中和数据文件的头部,每一个数据文件的头部都会记录数据文件的状态信息
(4)SMON---主内,对数据库实例进行维护,对shared pool中的碎片进行整合,负责对数据库实例内部进行清理和维护,(系统监视器),对SGA的内部进行一个维护
举一个例子
共享池里面放的sql语句和执行计划
用的时间长了,里面可能出现很多碎片。
这时SMonitor会对这些碎片进行整合。
也就是说SMonitor负责对数据库实例内部进行清理和维护的
(5)PMON---主外,对Server Process进行维护和清理,清理无用的Server Process(进程监视器)
例子
客户网络突然断了,serverprocess还一直为用户启着。
PMonitor会周期性的启动,
启动后发现某个serverprocess它所对应的客户已经死掉了,
他会把这个serverprocess进行清理。
包括把这个serverprocess进程关掉,
把这个serverprocess所对应的PGA内存空间,给它清理。
(6)ARCn归档日志进程
oracle中有很多日志文件,但是oracle最多只能保持三组日志,oracle首先使用第一组日志,往里记日志,等到第一个日志记完时,再往第二个日志文件中记录,第二组记满,使用第三组,而当第三组满了,反过来使用第一组。这时就把第一组覆盖了。
因为oracle最多只能保留三组日志,为了可以保留更多的日志,oracle有一个归档的工作模式。
写第一组日志,写满了这时候
oracle会启动一个进程叫ARCn。
这个进程会把日志归档到另外一个目录底下去,另外起一个名字,
大小和它一样。
然后开始写第二个日志log文件,第二个写满切到第三个的时候,
这个进程把第二个log日志写到归档到的那个目录下。
然后写第三个、第四个。
在归档这个位置,
保留了oracle所有的日志
我们要找较早的数据较早的日志会从归档中找。
Buffer Cache数据块
可以分为四种:
(1)干净:内存与磁盘的数据一致
(2)脏数据:内存与磁盘的数据不一致
(3)空闲或未使用
(4)已连接:数据被ping住
详解:
dbf中的数据读到内存SGA,
buffercache中的数据和磁盘dbf文件中的数据是一致的,
叫这个数据是干净的。
里面还有一些内存空间没有使用
这是空闲或未使用的。
还有对这个数据块,
serverprocess在内存里面把它的数据修改了,
内存里面的数据,和磁盘中的数据就不一致了。
这时的内存里面的数据叫脏数据。
脏数据就需要写回dbf文件。
写回来以后它俩又一致了,又成干净数据了。
还有在内存里面的数据
目前serverprocess正在对它读或者正在对它进行写,
那个瞬间,这个数据块叫pin住了。
翻译叫连接了。
写完以后马上成了脏数据了。
PIN是读写一瞬间,
对内存的读写瞬间速度非常快。
已连接就是pin住。
随着数据库的运行,
buffercache慢慢在被使用,
其内数据块有脏的、干净的、空闲的
再次把dbf中的一个数据调到内存的时候,它优先使用空闲的没使用过的。
如果buffercache中所有的数据都使用过了,没有空闲的,
它接着使用干净的。
因为干净的数据意味着磁盘上有一个和它一样的数据。
这样新数据可以覆盖掉干净的块。
再需要原来干净数据块时,可以再把原干净数据调入内存。
也就是说对buffercache来讲
干净的或者空闲的这些数据,内存数据是可以被重用的。
对脏的能不能不直接覆盖?
不能!
我们为了使用这个脏的数据块占用的内存空间,
比如说里面全是脏的,
我还需要再使用内存的时候,
就会触发DBWn,将脏块写回磁盘。
写回磁盘后原块就成干净的了,
干净的就可以被重用了。
这是buffercache中数据块的几个状态
其实有linux命令可以监控系统设备性能
1、vmstat
vmstat是一个很全面的性能分析工具,
可以观察到系统的进程状态、内存使用、虚拟内存使用、磁盘的IO、
系统(中断、上下文切换)、CPU使用等
[oracle@redhat4 ~]$ vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
3 0 204 61596 39456 669880 0 0 13 35 303 174 48 22 30 0
2、iostat
iostat主要用于监控系统设备的IO负载情况,运行时显示系统的各项统计信息
[oracle@redhat4 ~]$ iostat
avg-cpu: %user %nice %sys %iowait %idle
47.79 0.05 22.11 0.43 29.61
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 6.37 51.81 142.53 3267484 8989120
sda1 6.17 51.01 137.64 3216970 8680600
sda2 0.18 0.44 3.86 27814 243424
sda3 0.02 0.34 1.03 21716 65096
从这些数据可以知道 服务器整体是否繁忙。
不仅看命中率反馈问题,还要看物理读量的问题。
serverprocess在执行sql语句的时候,
需要从磁盘上dbf读数据的时候,
这个数据serverprocess从dbf里面读,
然后读到buffercache,然后从buffercache再返给用户。
查看SQL语句的执行情况
SQL> select /*hello*/ count(*) from t1 where OBJECT_ID=1;
COUNT(*)
----------
0
SQL> select /*hello*/ count(*) from t1 where OBJECT_ID=2;
COUNT(*)
----------
1
SQL> select /*hello*/ count(*) from t1 where OBJECT_ID=2;
COUNT(*)
----------
1
SQL> select sql_id,sql_text,executions from v$sql where sql_text like '%hello%';
SQL_ID
-------------
SQL_TEXT
--------------------------------------------------------------------------------
EXECUTIONS
----------
fvbb8qrfd0w5y
select /*hello*/ count(*) from t1 where OBJECT_ID=2
1
1vx8fabpy9dwv
select sql_id,sql_text,executions from v$sql where sql_text like '%hello%'
1
SQL_ID
-------------
SQL_TEXT
--------------------------------------------------------------------------------
EXECUTIONS
----------
8w6u2w729urmp
select /*hello*/ count(*) from t1 where OBJECT_ID=2
1
d3wjnjd4tm0p8
select /*hello*/ count(*) from t1 where OBJECT_ID=1
SQL_ID
-------------
SQL_TEXT
--------------------------------------------------------------------------------
EXECUTIONS
----------
1
参考博文:https://blog.csdn.net/xinzhan0/article/details/51933420
Oracle体系结构2的更多相关文章
- Oracle体系结构总结
1.Oracle 体系结构摘要图 2.Oracle 体系结构相关笔记 1.Oracle 体系结构摘要图 2.Oracle 体系结构相关笔记 可参考Oracle Architecture系列随堂笔记: ...
- oracle 体系结构
oracle 体系结构 数据库的体系结构是指数据库的组成.工作过程与原理,以及数据在数据库中的组织与管理机制. 1. oracle工作原理: 1).在数据库服务器上启动Oracle实例:2).应用程序 ...
- Oracle实例和Oracle数据库(Oracle体系结构)
--========================================== --Oracle实例和Oracle数据库(Oracle体系结构) --==================== ...
- 【转载】Oracle实例和Oracle数据库(Oracle体系结构)
免责声明: 本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除. 原文作者:Leshami 原文地址:http://blog.csdn.net/ ...
- oracle 体系结构解析
三.oracle 体系结构 1.oracle内存由SGA+PGA所构成 2.oracle数据库体系结构数据库的体系结构是指数据库的组成.工作过程与原理,以及数据在数据库中的组织与管理机制. oracl ...
- Oracle 课程一之Oracle体系结构
课程目标 •理解ORACLE数据库体系架构—内存结构和进程 •理解SQL在数据库中的运作流程 •理解UNDO&REDO原理 •理解commit原理 1.Oracle数据库概述 •数据库:物 ...
- oracle体系结构
oracle体系结构有四个部分组成分别为:oracle 服务器.用户进程.服务器进程.其他关键文件.其中oracle服务器又有实例(instance)和database组成是一个数据库管理系统. 一. ...
- Oracle体系结构之进程
Oracle体系结构之进程 一.概述 Oracle中的每个进程都要执行一个特定的任务(或者一组任务),每个进程都会为自己分配内存(PGA)来完成它的任务.一个Oracle实例主要有以下3类进程: (1 ...
- oracle 体系结构简介
1.1.SGA(system global area) SGA是oracle Instance的基本组成部分,在示例启动是分配.是一组包含一个oracle实例的数据和控制信息的共享内存结构.主要用于存 ...
- Oracle 体系结构chapter2
前言:Oracle 体系结构其实就是指oracle 服务器的体系结构,数据库服务器主要由三个部分组成 管理数据库的各种软件工具(sqlplus,OEM等),实例(一组oracle 后台进程以及服务器中 ...
随机推荐
- C++学习笔记-static
static做为关键字,在C++语言中运用在类中,代表着这个属性或者方法属于这个类 如果生成的对象修改了这个成员,那么其他对象共享修改后的值 定义和初始化 class ABC { public: in ...
- pycharm2019最新激活注册码(亲测有效)
激活码一: 812LFWMRSH-eyJsaWNlbnNlSWQiOiI4MTJMRldNUlNIIiwibGljZW5zZWVOYW1lIjoi5q2j54mIIOaOiOadgyIsImFzc2l ...
- redis在php中实际应用-list
1.LPUSH Redis Lpush 命令将一个或多个值插入到列表头部. 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作. 当 key 存在但不是列表类型时,返回一个错误.(在Re ...
- Django之ORM操作.md
1.ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...
- python_0基础开始_day12
第十二节 一,生成器 生成器的核心:生成器的本质就是迭代器 迭代器是python自带的 生成器是程序员自己写的一种迭代器 在python中有三种方式来创建生成器: 基于函数编写 推导式方式编写 pyt ...
- Zabbix 配置Python邮件告警
1.首先你应该注册一个163邮箱,用于发信,再注册时开启SMTP/POP3功能,使用加密密码认证. 2.在Zabbix主机上新建send.py文件,将以下代码复制编辑,设置发件用户.密码. [root ...
- Codeforces 1201E2. Knightmare (hard)
传送门 看到棋盘先黑白染色冷静一下 然后分析发现,如果初始时两只马在同色的格子,那么一定是后手吃先手 反之一定是先手吃后手 所以分类讨论一下,如果初始在同色的格子,并且后手到达终点的步数更少,那么后手 ...
- shiro登陆流程
登录请求被FormAuthenticationFilter拦截 FormAuthenticationFilter会执行其父类AdviceFilter的doFilterInternal方法 其代码如下: ...
- Scala学习二——控制结构和函数
一.if表达式有值 val s=if(x>0) 1 else -1,相当于Java中x>0?1:-1(不过不拿呢个在?:中插入语句),而且Scala中可以用混合类型(如if (x>0 ...
- Spring Boot 获取yaml配置文件信息
Spring boot 项目启动过程中: org.springframework.boot.SpringApplication#prepareEnvironment 当程序步入listeners.en ...