Oracle 共享池和数据库高速缓冲区,引出SQL执行过程

共享池在数据库中可以说是相当重要动力资源,关系着数据库的性能瓶颈。

什么是共享池呢?

共享池是内存结构中SGA(系统全局区)的一部分,包含了:库缓冲区、数据字典缓冲区、服务器结果缓冲区、预留池,也是着四个区组成了共享池,这四个区的功能就是共享池的功能。

库缓冲区

共享SQL区:存放执行计划和解析树,当用户执行一条SQL语句时,共享池会根据SQL语句的复杂程度分出一定的内存给用户,当用户再次执行相同的SQL语句时,不必再次进行解析,提高执行语句的执行效率。类似于古代将领带兵打仗,皇帝就是用户,把将领当成共享池,将领带大家走的路就是SQL语句,不用再自己摸索路线。

私有SQL区:里面主要存了一些SQL语句的环境设置,比如SQL语句的一些绑定变量、环境和会话参数,还有PL/SQL程序包的局部变量、全局变量和包变量。共享池里一个SQL语句的共享SQL区能被多个私有SQL区共有。即很多人能同时走这条路。

数据字典缓冲区

数据字典存在于SYSTEM表空间中,数据库中访问最频繁的就是它了,里面有表、视图等信息,数据库会借助数据字典对SQL语句进行解析,它分为两个部分存放,一部分以行(ROW)的方式存在数据字典缓冲区中,另一部分以块(BLOCK)的方式存放在库缓冲区中,这两个部分共同组成数据字典缓冲区,并被所有的用户进程共享。

服务器结果缓冲区

这也是共享池里显目的一点,将所有正确的SQL查询和函数结果缓存到服务器结果缓冲区里, 当多个用户执行相同的SQL语句时,只要它有过一次解析和执行计划,那么速度是与第一次完全不通档次的。

服务器结果缓冲区和数据库高速缓冲区有所区别,前者是缓冲到共享池里,不经过任何加工;后者需从磁盘读到内存,也就是经过加工。

预留池

如果有大片连续的内存分配,都会优先选择预留池。

共享池在不同的服务器模式下还有不同的结构

 
                                                         

当数据库处于专有服务器模式时,库缓冲区里只有共享SQL区,私有SQL区和UGA被分到程序全局区里;但处于共享服务器模式下,库缓冲区包含了私有SQL区,共享池里也有了UGA(用户全局区)。

总的来说,共享池就是SQL语句的专属区域,划分内存区域-->SQL语句的解析-->生成解析树-->制定执行计划-->返回查询结果-->被所有的用户进程共享这条SQL语句的执行计划和结果。

什么是数据库高速缓冲区?

为了避免数据库等待磁盘I/O,Oracle设计了数据库高速缓冲区,暂时存放用户执行查询语句时从数据文件(磁盘)读取出来的数据,避免了直接对磁盘I/O,并被当前实例的其他用户共享。

共享池和数据库高速缓冲区密切相关,共享池存放SQL语句的来龙去脉,数据库高速缓冲区是磁盘和内存之间的容器,每个查询都是要先访问共享池再到这个容器。数据库高速缓冲区里包含了保持池,回收池和默认池

可以看下面这个图了解下数据库高速缓冲区。

当发生SQL查询时,在共享池的服务器结果缓冲区里找不到结果,那么就会到数据库高速缓冲区里查找,如果有,则产生缓冲命中(Cache Hit),读取保持池,否则产生缓冲失误(Cache Miss),可能会读取默认池或者回收池,还有一种情况,如果在数据库高速缓冲区里找了很久,直到临界点,那么就会通知DBWn进程,将回收池里的脏缓冲器写入磁盘,再将默认池里的空闲缓冲器转移到回收池,变为脏缓冲器。

可想而知,一个SQL语句的执行过程大致如下:

欢迎大家指正!

时间: 2024-10-26 13:04:24

Oracle 共享池和数据库高速缓冲区,引出SQL执行过程的相关文章

2.2 数据库高速缓冲区

您所在的位置:读书频道 > 数据库 > Oracle > 2.2 数据库高速缓冲区 2012-05-10 21:38 张天慧 清华大学出版社 字号:T | T 综合评级: 想读(2)  在读(0)  已读(1)   品书斋鉴(0)   已有3人发表书评 <Oracle管理之道>第2章Oracle实例,本章重点在于深入解析Oracle本身运行时的内存空间,也就是Oracle的实例主体,但诚如本章开宗明义所说的,Oracle实例的成立并不代表用户或应用程序用户就能顺利使用Orac

SQL监控:mysql及mssql数据库SQL执行过程监控审计

最近生活有很大的一个变动,所以博客也搁置了很长一段时间没写,好像写博客已经成了习惯,搁置一段时间就有那么点危机感,心里总觉得不自在.所以从今天起还是要继续拾起墨笔(键盘),继续好好维护这个博客,写出心里最真实的想法,写出平时接触到的一些人和事以及一些新的技术.当然写博客也不是单纯的为了记录,也想通过博客来结交更多的朋友,今天在公司图书馆看到一句话大致说的是“在今天这个年代,已经很难等到三顾茅庐,诸葛亮也需要博客.微博和影响力”,在一年前就曾想过写一篇关于怎样通过博客来提高个人影响力的文章,我会尽

oracle &nbsp; SQL执行过程

1.sql执行过程 1>解析(判断对象是否存在,是否有权限查询,语义解析,检查缓存中是否有相同的SQL等等) 2>优化(CBO确定优化模式,确定访问路径,联接顺序,过程中通过很多综合因素估算出各种方式的资源消耗,选择消耗最小为优) 3>生成QEP(Query Execution Plan:查询执行计划) 4>执行QEP,返回结果

Oracle sql共享池$sqlarea分析SQL资源使用情况

遇到需要排查一个系统使用sql的情况,可以通过查询Oracle的$sql.$ssssion.$sqlarea进行统计排查 排查时可以先看一下$sql和$session的基本信息 select * from v$sql a, v$session b where b.SQL_ADDRESS = a.ADDRESS and b.SQL_HASH_VALUE = a.HASH_VALUE and b.SQL_CHILD_NUMBER = a.CHILD_NUMBER $sqlarea表列意思: 引用:h

O-理解共享池

我们可以通过show sga命令查看共享池的整体组成部分: ....待截图.... 一.SGA内存结构 Oracle中SGA主要包括: 1.固定数据结构部分(FIXED Size) 2.数据块缓冲区(DATABASE BUFFER) 3.REDO LOG缓冲区(redo buffers) 4.共享池(在variable size中). 固定区域包含了所有其他共享内存结构和重要的数据结构的地址和指针.资源.锁等,可通过如下命令详细列出具体内容: select pool,name,bytes fro

Oracle查看SQL执行计划的方式

Oracle查看SQL执行计划的方式   获取Oracle sql执行计划并查看执行计划,是掌握和判断数据库性能的基本技巧.下面案例介绍了多种查看sql执行计划的方式: 基本有以下几种方式: 1.通过sql_trace初始化参数 2.通过Autotrace 3.通过explain plan 4.通过dbms_xplan.display_cursor 5.通过dbms_xplan.display_awr 6.通过10046事件 1.通过explain plan 工具 12:24:00 [email

oracle学习笔记 SQL语句执行过程剖析讲课

oracle学习笔记 SQL语句执行过程剖析讲课 这节课通过讲述一条SQL语句进入数据库 和其在数据库中的整个的执行过程 把数据库里面的体系结构串一下. 让大家再进一步了解oracle数据库里面的各个进程.存储结构以及内存结构的关联关系. 首先来讲整个体系中有客户端.实例和数据库 数据库里有三类文件 控制文件ctl.数据文件dbf.日志文件log 实例中SGA有六大池子 第一大内存区shared pool即共享池 第二大内存区buffer cache 第三块是redo log 我们主要讲上面的三

ORACLE将执行过的SQL语句存放在内存的共享池

Oracle SQL性能优化深入浅出 ORACLE将执行过的SQL语句存放在内存的共享池(shared buffer pool)中,可以被所有的数据库用户共享.当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同,ORACLE就能很快获得已经被解析的语句以及最好的执行路径. 这个功能大大地提高了SQL的执行性能并节省了内存的使用. 为了不重复解析相同的SQL语句,在第一次解析之后,Oracle将SQL语句存放在内存中.这块位于系统全局区域SGA(systemglob

ORACLE从共享池删除指定SQL的执行计划

Oracle 11g在DBMS_SHARED_POOL包中引入了一个名为PURGE的新存储过程,用于从对象库缓存中刷新特定对象,例如游标,包,序列,触发器等.也就是说可以删除.清理特定SQL的执行计划,这样在特殊情况下,就避免你要将整个SHARED POOL清空的危险情况.例如某个SQL语句由于优化器产生了错误的执行计划,我们希望优化器重新解析,生成新的执行计划,必须先将SQL的执行计划从共享池中刷出或将其置为无效,那么优化器才能将后续SQL进行硬解析.生成新的执行计划.这在以前只能使用清空共享