首页 > 数据库 >3、oracle内存讲解

3、oracle内存讲解

时间:2024-11-18 10:08:06浏览次数:1  
标签:执行 buffer 数据库 讲解 内存 SQL oracle 解析

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,只产生了十次物理读,其余都是内存读

标签:执行,buffer,数据库,讲解,内存,SQL,oracle,解析
From: https://www.cnblogs.com/xgq20210831/p/18551844

相关文章

  • 程序设计2596基于ASP.NET的滑雪网站的设计与实现【源码+讲解视频】滑雪产品租赁网站/
    项目包含:源码、讲解视频、说明文档,部署录像开发环境开发工具:VisualStudio2010或以上版本数据库:SQLServer2005或以上版本开发语言:c#操作系统:windows7或以上浏览器:GoogleChrome(推荐)、Edge、360浏览器系统用户分为:管理员、普通用户界面设计......
  • C++时间复杂度讲解
    它约等于算法中基本操作重复执行的次数(循环或递归的次数)不是行数!!!最多为O(5)!!!用乘号连接(在嵌套循环中),时间复杂度用O()表示。(O()只是符号)如:for(int=1;i<=n*10/8;i++){      for(intj=1;j<=n*10/2;k++){             for(intk=1;k<n*10;k++)......
  • 纯C实现内存池
    1.介绍    内存池,池式结构三幻神之一,它拥有池式结构的设计初衷,为了管理和重用一组初始化的对象或资源,但作者认为,它更重要的初衷应该是一种虚拟内存的管理组件,对于需要长时间运行的程序尽可能的避免出现内存碎片。2.设计思路    内存池可以分为两种,定长和不......
  • 层次聚类——以凝聚型层次聚类为例讲解(易懂版)
            层次聚类是一种将数据集逐步划分为层次结构的方法,是一种无监督学习方法最终形成一颗树状图(dendrogram),可以直观地表示不同数据点之间的聚类关系。它是一种无监督学习方法。层次聚类的两种方法凝聚型(自底向上):这是最常见的方法,从每个数据点开始,将它们作为单独......
  • 【视频讲解】Python深度神经网络DNNs-K-Means(K-均值)聚类方法在MNIST等数据可视化对比
    全文链接:https://tecdat.cn/?p=38289原文出处:拓端数据部落公众号分析师:CucuSun近年来,由于诸如自动编码器等深度神经网络(DNN)的高表示能力,深度聚类方法发展迅速。其核心思想是表示学习和聚类可以相互促进:好的表示会带来好的聚类效果,而好的聚类为表示学习提供良好的监督信号。关......
  • 基于微信小程序的学生在线投票系统小程序app项目(源码+lw+部署文档+讲解等)
    项目整体介绍基于微信小程序的学生在线投票系统小程序为校园投票活动提供了便捷的解决方案。它具有简洁易用的界面,方便学生快速上手。活动组织者可以轻松创建投票项目,设定投票主题、选项、投票规则,如是否允许多选、投票起止时间等。在投票过程中,系统能实时统计票数,通过直......
  • 数据在内存中的存储(详细)
    目录数据在内存中的存储1.数据类型介绍(1)内置类型(2)自定义类型(3)指针类型(4)空类型(void)2.数据在内存中的存储《1》整型数据在内存中的存储原码,反码,补码《2》整型数据的运算与打印《3》大小端介绍(1)来历(2)模式介绍及效果(3)模式判断《4》浮点型数据在内存中的存储(1)十进制浮点......
  • 【计算机毕业设计选题推荐】基于spring boot的交通旅游订票系统的设计与实现 【附源码
    ✍✍计算机编程指导师⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java实战|SpringBoot/SSMPython实战项目|Django微信小程......
  • 温故知新,基于播客形式学习英语之EnglishPod 365, Elementary集合41-50(音频、原文、讲
    未经作者授权同意,请勿随意转载!!!(https://www.cnblogs.com/taylorshi/p/18550339)简介Enishpod是一家公司叫做PraxisLanguage推出的收费讲座,相比较ESLPod,EnishPod为常速。Enishpod极具趣味性,两位主持人Marco和Amira的讲解很生动幽默,完全有别于新概念类型听力的乏味。同时,Enis......
  • 【汇编语言】更灵活的定位内存地址的方法(三)—— 不同的寻址方式的灵活应用
    文章目录前言1.比较不同的寻址方式2.问题一3.问题一的分析与求解3.1分析3.1.1数据的存储结构3.1.2分析处理过程3.2代码实现4.问题二5.问题二的分析与求解5.1分析5.1.1数据的存储结构5.1.2分析处理过程5.2代码实现6.问题三7.问题三的分析与求解7.1分......