本文主要介绍“甲骨文记忆结构面试题有哪些”。在日常操作中,我相信很多人对甲骨文内存结构的面试题有哪些疑问有疑问。边肖查阅了各种资料,整理出简单易用的操作方法,希望能帮你解答“甲骨文内存结构面试题有哪些”的疑惑!接下来,请和边肖一起学习!
一:Oracle内存结构由哪几部分组成?
1User global area (UGA)
2Program global area (PGA)
3System global area (SGA)
4软件代码区Software code areas
二:请分别介绍下UGA、PGA、SGA、软件代码区?
1 UGA
UGA是用户全球区域,主要存储与用户会话相关的信息,如登录信息。
在会话的生命周期中,UGA必须可供数据库会话使用。
因此,当连接模式是专用服务器连接模式,即一个会话对应一个连接时,UGA存储在PGA中。
但是,当连接方式为共享服务器,即多个会话对应一个连接时,UGA存储在SGA的大池中,如果大池空间不足,UGA将存储在共享池中。在大多数情况下,使用专用服务器连接模式。
2 PGA
PGA(进程全局区域)程序全局区域,PGA是一个非共享内存区域,其中包含特定于Oracle进程的数据和控制信息。Oracle进程启动时创建PGA。对于每个服务进程和后台进程来说,所有单个PGA的集合就是总的实例PGA大小。
PGA内容:
PGA有两个主要领域,私有SQL区域、SQL工作区域。
私有SQL区域存储SQL的绑定变量值和查询执行状态信息,客户端进程负责管理私有SQL区域。由分配的私有SQL区域的数量受到初始化参数OPEN_CURSORS的限制。
SQL工作区主要用于排序操作、Hash连接、位图合并连接时使用的内存。
诸如排序依据、分组依据等操作。
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也是一个很大的记忆区域。用户可以比磁盘上的数据更快地访问数据库缓存中的数据(内存读取效率比磁盘读取效率高约14000倍),因此应用系统应该尽可能多地从数据库缓存中访问数据。在大多数情况下,数据库缓存的命中率越高,访问性能越好。
缓冲池包括: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内存结构面试题有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/71158.html