Oracle内存结构面试题有哪些

技术Oracle内存结构面试题有哪些这篇文章主要介绍“Oracle内存结构面试题有哪些”,在日常操作中,相信很多人在Oracle内存结构面试题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家

本文主要介绍“甲骨文记忆结构面试题有哪些”。在日常操作中,我相信很多人对甲骨文内存结构的面试题有哪些疑问有疑问。边肖查阅了各种资料,整理出简单易用的操作方法,希望能帮你解答“甲骨文内存结构面试题有哪些”的疑惑!接下来,请和边肖一起学习!

一: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

(0)

相关推荐

  • 十二节气顺口溜,二十四节气的顺口溜怎么说

    技术十二节气顺口溜,二十四节气的顺口溜怎么说《二十四节气歌》 春雨惊春清谷天十二节气顺口溜,夏满芒夏暑相连, 秋处露秋寒霜降,冬雪雪冬小大寒。 二十四节气,是中国古代人们用来分辨节气的时间及指导农事的一种方法。二十四节气

    生活 2021年10月21日
  • MySQL Index Condition Pushdown(ICP)的使用限制有哪些

    技术MySQL Index Condition Pushdown(ICP)的使用限制有哪些小编给大家分享一下MySQL Index Condition Pushdown(ICP)的使用限制有哪些,希望大家阅读完这篇文章之

    攻略 2021年11月3日
  • 怎么使用Oracle数据库的逻辑备份工具

    技术怎么使用Oracle数据库的逻辑备份工具这篇文章主要介绍“怎么使用Oracle数据库的逻辑备份工具”,在日常操作中,相信很多人在怎么使用Oracle数据库的逻辑备份工具问题上存在疑惑,小编查阅了各式资料,整理出简单好

    攻略 2021年11月5日
  • ubuntu中如何解决php无法编译问题

    技术ubuntu中如何解决php无法编译问题小编给大家分享一下ubuntu中如何解决php无法编译问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一

    2021年12月10日
  • 缓冲区溢出实践

    技术缓冲区溢出实践 缓冲区溢出实践缓冲区溢出实践
    20191331lyx
    一、实验环境
    实验楼 https://www.lanqiao.cn/courses/231二、实验准备关闭内存地址空间随机化三、

    礼包 2021年11月1日
  • .NET Framework SQL Server 数据怎样提供程序连接池

    技术.NET Framework SQL Server 数据怎样提供程序连接池.NET Framework SQL Server 数据怎样提供程序连接池,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家

    攻略 2021年11月29日