oracle数据库实例(instance)

数据库打开以后,会生成一个内存结构和一堆进程

内存和进程:就是oracle的实例instance

oracle数据库实例结构:

用户是通过连接实例来访问数据库的

shared pool占整个内存的20%

buffer cache占整个内存的80%

redo log buffer占20~100M,一般是100M

各种pool一般占100M

在数据库里,一般数据库的物理内存的50%给oracle,这50%的内存的80%内存给shared pool、buffer cache、redo log buffer、各种pool加起来的一个总和,但是具体情况要根据具体的生产来定

SQL

对于oracle数据库来讲,用户发一个SQL过来,给Oracle数据库,oracle数据库经过执行处理,得到一个结果集,然后返给用户

oracle数据库就是处理SQL,执行SQL的

例如:执行select name from t1 where id = 5;这一条SQL

这是一个SQL文本,对于oracle来说,这个文本显然是不能执行的,

所以对于oracle来说,做的事是:

第一件事是,oracle接收到一个SQL以后,对这个SQL文本进行解析(parse);

第二件事是:解析完了以后,生成一个oracle能认识的,能够照着去执行的SQL执行计划(explain)

第三件事是:oracle照着这个执行计划去执行这个SQL

这个SQL进行解析,生成执行计划,它是要消耗cpu资源的

oracle把SQL语句解析成执行计划,它需要做什么呢?(这个解析包含什么呢?)

1、判断有没有t1这个表,t1表里有没有id这个列,有没有name这个列,这个SQL语法对不对,id列上有没有索引,如果id=5了预计能返回几行数据等等

2、判断完了以后,通过计算生成执行计划

SQL执行计划

执行计划:就是这个SQL要执行的最好的路径(就比如像是导航时的最佳路线)

一条SQL语句一般有多条执行路径,所以解析就需要去判断,去计算哪条是最好的路径,这就需要消耗cpu资源,由于解析需要消耗cpu资源,oracle就会把这个SQL语句和SQL执行计划存到shared pool里

将SQL和SQL执行计划存到shared pool里面有什么好处呢?

下一次一个用户连接上数据库实例以后,执行这个SQL,另外一个用户连接上以后也要执行这个SQL,它就在shared pool里发现,这个SQL对应的执行计划已经被解析过了,这时就不需要像第一个用户第一次执行这个SQL时,执行那么多的解析过程

shared pool里面存着,或者缓存着曾经执行过的SQL,以及SQL对应的执行计划,那么任何一个用户登录到数据库以后,先去shared pool里面找,这个SQL有没有被解析过,shared pool里面有没有这个SQL及对应的执行计划,如果有就不必像第一个用户那样去执行那么多的解析过程

硬解析(hard parse)

第一个用户连接上数据库实例,发送一个SQL给数据库实例,但是在shared pool里面找不到这个SQL及对应的SQL执行计划,就要解析这个SQL,这种解析叫做硬解析

数据库启动以后,随着业务的增加,一段时间稳定以后,数据库的硬解析就非常低了,因为shared pool的作用,一般每秒钟小于5个硬解析,也就是每秒产生新的SQL,解析新的SQL的数量小于5

软解析(soft parse)

第二个用户连接上数据库实例,执行跟第一个用户同样的一条SQL,而在shared pool里面有这个SQL及对应的SQL执行计划,这时候也要解析,这种解析叫做软解析

软解析比硬解析少了好多步骤,所以说,软解析消耗的资源比硬解析消耗的资源少好多

shared pool(共享池)

shared pool的作用:

就是减少硬解析,缓存SQL以及SQL的执行计划来减少硬解析

SQL的执行步骤

1、解析(parse)

2、执行(execute)

3、获取(fetch)

SQL分两类:

1、select(查询、访问数据的)

2、DML(insert、update、delete)涉及到数据修改的

对于oracle来讲,不管是select还是DML都需要解析:

对于DML解析完了,对应的是执行;

对于select解析完了,对应的是获取。

但是一般我们都说SQL的执行步骤都是:解析(parse)---> 执行(execute) ---> 获取(fetch)

datafile(数据文件)

无论是执行还是获取,oracle都会做一件事,就是访问表(表数据),就要访问数据库的datafile文件



图解:

数据库的datafile被格式化成一个一个的block(数据块),block的大小:2K、4K、8K、16K、32K,一般的是:8K;一个block里面存放着多行数据,比如有100行数据

block是IO的最小单位(最小单元)

buffer cache

缓存着表,缓存着block



图解:

buffer cache,oracle也把它格式化成8K大小的一个一个的buffer

用户访问表里的一行数据,这一行数据呢,在一个block里面,这时候oracle会把整个block里面全部的数据行都读取到buffer cache里面去,只需要一行,不管是100行还是多少行,都把整个block加载到buffer里面去

redo log buffer

oracle把整个block里面全部的数据行都读取到buffer cache里面去之后,对其中的一行数据进行修改(insert、update、delete),在内存里面修改,修改完之后,它会对修改的那个动作产生一个日志,记录到redo log buffer里面去;
修改完了之后,马上要提交,提交的时候,又把redo log buffer里面的日志写到数据库的redo log里面去;这时候,在buffer里面被修改的数据就没必要马上写回数据库的datefile里面去了,因为相关的日志已经被保存到redo log里面了,就算这时候数据库突然崩了,被修改过的数据还没被写到磁盘上,被修改的数据没了,等数据库重新启动以后,oracle会使用redo log里面被修改过的数据的日志,自动的再把那一行数据找回来再重新修改回来 所以对于oracle来说,只要日志保存了,被修改过的数据就被保存了 只要对表,对block进行修改,就一定会产生日志;只要提交,日志就会被写到磁盘上,永久保存;只要日志保存了,我们就认为对这个block的修改就永久保存了,因为oracle会自动的对没有从buffer写到block的数据,使用redo log重新恢复过来

redo log buffer的作用:缓存redo log

命中

一个用户要修改或者读取表里的一行数据,但是这一行数据在buffer cache里面没有,这时候就要到磁盘的block里面找,找到之后oracle就把这个block读取到buffer里去,再从buffer里面修改或者读取;然后第二个用户,他也要读取这个表里的另外一行数据,这行数据也在这个block里面,这时候,第二个用户就在buffer cache里面找到了那一行数据,就没有必要再从磁盘上读取,也避免了物理读,这叫做一次命中

命中率

命中率一般可以达到99.9%;假设oracle读一万次buffer,只产生了十次物理读,其余都是内存读

3、oracle内存讲解的更多相关文章

  1. Oracle内存管理技术

    1.Oracle内存管理技术 2.配置自动内存管理(AMM) 3.监视自动内存管理(AMM) 4.配置自动共享内存管理(ASMM) 5.配置自动PGA内存管理 Reference 1.Oracle内存 ...

  2. 【转】oracle内存分配和调优总结

    转自 http://blog.itpub.net/12272958/viewspace-696834/ 一直都想总结一下oracle内存调整方面的知识,最近正好优化一个数据库内存参数,查找一些资料并且 ...

  3. 修改oracle内存占用

    修改oracle内存占用   ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # su oracle      $cd $ORACLE_HOM ...

  4. Oracle内存管理理论篇二

    目标 了解oracle内存管理方式 掌握ASMM管理方式 掌握AMM管理方式 监控内存使用 学习一个知识点时,最好先了解其历史.ORACLE近期的版本都对内存管理做了简化,从9i通过PGA_AGGRE ...

  5. 2014年1月9日 Oracle 内存与结构

    Oracle启动时为启动一个实例 主要为 实例 SVG 数据库文件 其它文件 1.Oracle:  内存 进程  其他文件 1.1 SVG内存(Cache)  1.1.1 共享池(Shared Poo ...

  6. oracle内存优化

    一直都想总结一下oracle内存调整方面的知识,最近正好优化一个数据库内存参数,查找一些资料并且google很多下.现在记录下来,做下备份.         一.概述:                ...

  7. Oracle内存详解之 Library cache 库缓冲

    Oracle内存详解之 Library cache 库缓冲 2017年11月09日 11:38:39 阅读数:410更多 个人分类: 体系结构 Library cache是Shared pool的一部 ...

  8. Oracle数据库基础入门《二》Oracle内存结构

    Oracle数据库基础入门<二>Oracle内存结构 Oracle 的内存由系统全局区(System Global Area,简称 SGA)和程序全局区(Program Global Ar ...

  9. ipcs命令以及oracle内存段

    今天是2014-01-06,在没过春节之前重新复习一下2013年学习的内容,关于oracle内存段在我之前写的blog中有详细操作.在此记录一下ipcs命令的用法. http://blog.csdn. ...

  10. Oracle内存详解之二 Library cache 库缓冲-转载

    Library cache是Shared pool的一部分,它几乎是Oracle内存结构中最复杂的一部分,主要存放shared curosr(SQL)和PLSQL对象(function,procedu ...

随机推荐

  1. thymeleaf学习问题整理

    使用配置 <properties> <java.version>1.8</java.version> <thymeleaf.version>3.0.9. ...

  2. stm32f10x系列学习笔记(三)ADC

    ADC_SampleTime 用途:在ADC通道配置(ADC_RegularChannelConfig)需要传输的参数. 含义:指两个采样阶段之间的延迟周期数,该参数会影响ADC在采样过程中的性能和准 ...

  3. Vue开发转到React开发,Prettier - Code formatter失效的问题

    Vue转到React,Prettier - Code formatter失效,按下Ctrl+S无效,需要手动格式化一次 然后选择默认的格式化方式 之后按下Ctrl+S就可以进行格式化啦!!!

  4. docker context 介绍

    $ docker context ls NAME DESCRIPTION DOCKER ENDPOINT ERROR default Current DOCKER_HOST based configu ...

  5. 语音识别 可以跑在MCU上吗

    Ref: https://developer.arm.com/Additional%20Resources/Video%20Tutorials/AITechTalk-Video-Speech%20re ...

  6. Ubuntu18.04未发现WiFi适配器情况解决方案之一

    问题: 第一次你可能会遇见这种情况,ubuntu未发现Wifi适配器解决方案  无法打开WIfi 并告诉你没有WiFi适配器 解决方案: 解决方案如下: sudo modprobe -r ideapa ...

  7. 学习高校课程-软件设计模式-软件设计原则(lec2)

    Feature of Good Design (1) 优秀设计的特点(一) Code reuse 代码复用 – Challenge: tight coupling between components ...

  8. Identity – HTTP Authentication

    前言 HTTP Authentication 是很古老的东西. 已经很少地方会用到了. 但还是给我遇上了. 在做 Google Ads Offline Conversion 时, 它提供了 2 种方式 ...

  9. P1543 [POI2004] SZP 题解

    P1543 [POI2004] SZP 题解 传送门. 题目简述 有 \(n\) 个人,每个人都会监视另一个人,要求选出尽可能多的同学,使得选出的每一名同学都必定会被监视到.且选出的同学不可再监视其他 ...

  10. duxapp:基于Taro使用模块化开发,提升开发效率

    duxapp是基于Taro二次开发的模块化框架 使用这个框架,结合框架提供的UI库和工具库,能帮助你快速且高质量的完成项目,且能实现同时开发小程序.H5.APP(React Native),并且保证各 ...