您好,登录后才能下订单哦!
这篇文章主要介绍“Oracle内存结构面试题有哪些”,在日常操作中,相信很多人在Oracle内存结构面试题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Oracle内存结构面试题有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
一:Oracle内存结构由哪几部分组成?
1 User global area (UGA)
2 Program global area (PGA)
3 System global area (SGA)
4 软件代码区Software code areas
二:请分别介绍下UGA、PGA、SGA、软件代码区?
1 UGA
UGA是用户全局区,主要存放用户会话的相关信息,比如登录信息。
在会话的生命周期内,UGA必须对数据库会话可用。
所以,在连接模式是专用服务器连接模式时,也就是一个会话对应一个连接,UGA存储在PGA中。
但是在连接模式是共享服务器时,也就是多个会话对应一个连接,UGA存储在SGA中的large pool,如果large pool空间不够,UGA会存储在shared pool。大多情况下都使用专用服务器连接模式。
2 PGA
PGA(Process Global Area)程序全局区,PGA是一个非共享内存区域,它包含Oracle进程专用的数据和控制信息。在Oracle进程启动时创建PGA。由每个服务进程和后台进程专有,所有单个PGA的集合就是总实例PGA大小。
PGA内容:
PGA主要有两个区域,私有SQL区域、SQL工作区域。
私有SQL区域存储SQL的绑定变量值、查询执行状态信息,客户端进程负责管理私有SQL区域。分配的私有SQL区域的数量受初始化参数OPEN_CURSORS的限制。
SQL工作区主要用于排序操作、Hash连接、位图合并连接时使用的内存。
比如 order by、group by等操作。
PGA管理:
在Oracle8i 中,PGA调整非常复杂,要调整SORT_AREA_SIZE、HASH_AREA_SIZE、BITMAP_MERGE_AREA_SIZE、 CREATE_BITMAP_AREA_SIZE等参数。在ORACLE9I以后,只需要调整 PGA_AGGREGATE_TARGET,这个值是个软限制,比如设置大小2G,只是一个目标值,实际上PGA大小可以超过2G。在12C开始引入PGA_AGGREGATE_LIMIT参数限制Oracle实例PGA使用内存的上限,如果超过限制就采取终止会话的方式来降低PGA内存的使用量。
3 SGA
系统全局区域(SGA),是一组共享内存结构,所有服务器和后台进程共享SGA。
与Oracle后台进程一起构成数据库实例。
可以在V$SGASTAT视图中查询关于SGA组件的信息。最重要的SGA组件如下:
•Database Buffer Cache
•Shared Pool
•Redo Log Buffer
•In-Memory Area
•Large Pool
•Java Pool
•Fixed SGA
•可选的与性能相关的SGA子区域
(1)Database Buffer Cache
数据库缓冲区缓存,也称为缓冲区缓存,是数据文件上的数据块在内存中的副本。主要是为了在内存中进行高速的数据查找和更新,尽量减少磁盘的IO操作。也是SGA中占比比较大的一块内存区域。用户访问DB Cache 的数据比访问磁盘上的数据速度更快数(内存的读取效率是磁盘读取效率约14000倍),因此应用系统应该尽可能多地从DB Cache中访问数据。在大多数情况下,DB Cache 的命中率越高,访问性能就越好。
缓冲池包括:default默认池、keep保留池、recycle回收池
Buffer Cache管理:
通过三条链表进行管理:HASH链表、检查点队列链表、LRU链表
HASH链表
HASH链表的作用是通过HASH算法(消耗CPU资源),提高DB Cache中数据块的定位速度。也就是逻辑读。
比如,根据需要访问块的块号、文件号计算HASH值,在通过HASH值找到对应的HASH Bucket,搜索Buckect后的链表,找到目标BH(Buffer Header),通过BH找到BA(Buffer Address),按照BA访问具体的Buffer,这个就是逻辑读的过程。
检查点队列链表(CKPT-Q)
主要用于记录脏块。
Buffer Cache其实就是磁盘数据文件的缓存,以修改块的操作为例,如update,只是修改Buffer Cache中的Buffer,修改完成后,update操作就算完工了。这样Buffer中的数据和磁盘中的block就不一致了,这样的Buffer就是脏Buffer,脏块由DBWR进程统一写磁盘,但是Buffer Cache通常很大,有几万或几十万Bufeer,怎么在Buffer Cache中找到哪些是脏Buffer呢,这就需要一个链表,将所有脏Buffer都串起来,DBWR写脏块时,就是按照这个串起来的链表的顺序来写,这样的脏链表有两个,一个是LRUW,另一个是CKPT-Q。在buffer cache中,修改完数据后,会将对应的数据块加入到检查点队列(CKPT-Q)。
LRU链表(最近最少使用链表)
物理读时,服务器进程将数据块从数据文件读进Buffer Cache中,假如Buffer Cache有10000个Buffer,那么进程应该覆盖哪个Buffer呢?
简单说,就是进程将数据块读进Buffer Cache的什么地方。
答案是,覆盖最不常用的Buffer,LRU主要就是解决如何快速找到最不常用的Buffer。
在Oracle 8i之前,LRU算法是,DB Cache在LRU上是会移动的,常用的缓冲会被换到LRU的热端,不常用的缓冲会被挤到LRU的冷端,一般来说会话分配Cache时,会从LRU的冷端开始查找。这种LRU算法会产生性能瓶颈。
从 Oracle 8i 开始,LRU 的算法有所改进,LRU 链上的缓冲不再需要移动了,而是通过 tch计数器大小值来判断某个数据块是否为热块。
(2)Redo Log Buffer
重做日志缓冲区是SGA中的一个循环缓冲区,它存储描述数据库更改的重做条目。
重做记录是一种数据结构,它包含重做DML或DDL操作对数据库所做更改所需的信息。数据库恢复将重做项应用于数据文件以重构丢失的更改。
LGWR按顺序将数据块写入磁盘,而DBW将数据块分散写入磁盘。分散写比顺序写要慢得多。因为LGWR允许用户避免等待DBW完成缓慢的写操作,所以数据库提供了更好的性能。
LOG_BUFFER初始化参数指定Oracle数据库在缓冲重做条目时使用的内存量。与其他SGA组件不同,重做日志缓冲区和固定SGA缓冲区不会将内存分成颗粒。
(3)Shared Pool
相比于Buffer Cache,共享池中的内容可谓是杂乱无章。Oracle基本上将不能放进Buffer Cache中的数据都扔进了共享池,使得共享池的分配和释放极为频繁。
共享池中最基本的内存分配单元成为Chunk,相当于Buffer Cache中的Buffer或块的概念。
Chunk的大小极不统一,最新的Chunk可以只有十来个字节,最大的Chunk有几十兆甚至几百兆。基本内存单元大小的不统一,再加上频繁进行分配、释放操作,使共享池中极易产生内存碎片。总的来说,共享池是Oracle中最复杂的内存池。
包括以下内容:
•Library Cache
•Data Dictionary Cache
•Server Result Cache
•Reserved Pool
1 Library Cache
库缓存主要存储用户提交的SQL语句、SQL语句相关解析数、SQL执行计划、PL/SQL程序块等。
2 Data Dictionary Cache
dictionary cache里存放了数据字典的内存结构,包括表的定义、Storage信息、用户权限信息、约束定义、表的统计信息等。SQL语句解析期间频繁地访问数据字典。构造dictionary cache的目的是为了加快SQL解析过程中语义解析的速度。
数据字典缓存也被称为行缓存(Row Cache),因为它是以记录行为单元存储数据的,而不像 Buffer Cache 是以数据块为单元存储数据。
3 Server Result Cache
服务器结果缓存是共享池中的内存池。与缓冲池不同,服务器结果缓存保存结果集,而不是数据块。
执行查询时,数据库将确定查询结果是否存在于查询结果缓存中,如果结果存在,那么数据库将从缓存中检索它,而不是执行查询。缓存使数据库能够避免重新读取数据块和重新计算结果的昂贵操作。
4 Reserved Pool
保留池是共享池中的一个内存区域,Oracle数据库可以使用它来分配大的连续内存块。
如果Oracle解析一个PL/SQL程序单元,也需要从共享池中分配内存给这些程序单元对象。由于这些对象本一般比较大(如包),所以分配的内存空间也相对较大。系统经过长时间运行后,共享池可能存在大量内存碎片,导致无法满足对于大块内存段的分配。为了使有足够空间缓存大程序块,Oracle 专门从共享池内置出一块区域来来分配内存保持这些大块。
数据库以块的形式从共享池分配内存。分块允许将大对象(超过5 KB)加载到缓存中,而不需要单个连续区域。通过这种方式,数据库减少了内存碎片的产生。
(4)Large Pool
大池是一个可选的内存区域,用于比共享池更大的内存分配。
大池可以为以下情况提供大内存分配:
•用于共享服务器和Oracle XA接口(用于事务与多个数据库交互)
•并行执行中使用的消息缓冲区
•用于恢复管理器(RMAN) I/O从属的缓冲区
(5)Java Pool
Java池是存储Java虚拟机(JVM)中所有特定于会话的Java代码和数据的内存区域。此内存包括在调用结束时迁移到Java会话空间的Java对象。
对于专用服务器连接,Java池包括每个Java类的共享部分,包括方法和只读内存(如代码向量),但不包括每个会话的Java状态。
(6)可选的与性能相关的SGA子区域
一些SGA子区域只针对特定的性能特性启用。本节包含以下主题:
•In-Memory Area
•Memoptimize Pool
In-Memory 是12C 开始,在 SGA 中新增加的内存区域,可以实现表数据按列存储;
In-Memory 并没有取代传统的Buffer Cache ,二者并存在 SGA 中。列式存储在访问多行、少列情况下性能更优。
memoptimize pool大小通过MEMOPTIMIZE_POOL_SIZE设置,其中存储着启用了fast lookup表的散列索引。
从18c开始支持Memoptimized Rowstore,可用于提高查询性能。针对频繁基于主键查询的SQL语句的性能提高十分明显。可以通过CREATE TABLE或ALTER TABLE…MEMOPTIMIZE FOR READ语句来启用表的fast lookup。
(7)软件代码区概述
软件代码区是存储正在运行或可以运行的代码的内存的一部分。Oracle数据库代码存储在一个软件区域中,这个软件区域通常比用户程序的位置更具排他性和受保护性。软件区域的大小通常是静态的,只有在软件更新或重新安装时才会改变。这些区域所需的大小因操作系统而异。
软件区域是只读的,可以安装共享的,也可以安装非共享的。有些数据库工具和实用程序(如Oracle Forms和SQL*Plus)可以安装为共享的,但有些则不能。在可能的情况下,数据库代码是共享的,这样所有用户都可以访问它,而不需要在内存中有多个副本,从而减少了主内存,并在总体上提高了性能。如果在同一台计算机上运行,数据库的多个实例可以将相同的数据库代码区域用于不同的数据库。
到此,关于“Oracle内存结构面试题有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。