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. 二. Spring Boot 中的 “依赖管理和自动配置” 详解透彻到底(附+详细代码流程)

    二. Spring Boot 中的 "依赖管理和自动配置" 详解透彻到底(附+详细代码流程) @ 目录 二. Spring Boot 中的 "依赖管理和自动配置" ...

  2. CSIG企业行-走进合合信息成功举行,聚焦生成式人工智能、智能文档处理前沿热点

    3月18日,由中国图象图形学学会(CSIG)主办,合合信息.CSIG文档图像分析与识别专业委员会联合承办的"CSIG企业行"系列活动成功举办.此次活动以"图文智能处理与多 ...

  3. ASP.NET Core Library – HtmlSanitizer

    介绍 要输出 Raw HTML 最好是先消毒一下. 使用 Library 就可以了. 参考 Github – mganss / HtmlSanitizer 安装 nuget dotnet add pa ...

  4. Kubernetes基础(Pod?Label?Namespace?Deployment?Service?)(十二)

    上面我们都是在架构层面了解 Kubernetes,但是似乎没有发现关于容器的说明,Kubernetes 作为容器编排引擎,那么他是怎么去对容器进行编排的呢?在 Kubernetes 集群中抽象了很多集 ...

  5. Docker基本操作(端口?网络模式?)(五)

    一.端口暴露 Docker 容器更多情况下是用来运行 Web 应用的,所以要如何访问到容器中的 Web 服务呢?比如我们现在运行一个 nginx 容器服务: $ docker run --name w ...

  6. 命令行gcc -v和g++ -v输出版本不一致

    命令行gcc -v和g++ -v输出版本不一致 前言:本文初编辑于2024年1月30日 CSDN主页:https://blog.csdn.net/rvdgdsva 博客园主页:https://www. ...

  7. springboot 基本配置文件

    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/game?useUnicode=true&zeroDateTimeBehavior=conv ...

  8. 关于Android Q平台上qssi的介绍

    QSSI 是 Qualcomm Single System Image 的缩写. Android Q上开始支持QSSI. QSSI 是用来编译system.img的3.1 QSSI编译注意事项 lun ...

  9. 墨天轮沙龙 | 腾讯云陈昊:TDSQL-C Serverless应用与技术实践

    导读 数据库的发展由对性能的要求,逐步发展为对更为极致成本的要求,Serverless数据库是在高性能云数据库之上的极致成本优化方案.[墨天轮数据库沙龙-Serverless专场]邀请到腾讯云数据库产 ...

  10. iOS上架App Store使用小结

    1.安装iOS上架辅助软件Appuploader 2.申请iOS发布证书(p12) 3.申请iOS发布描述文件(mobileprovision) 4.打包ipa 5.上传ipa到iTunes Conn ...