Oracle 内存结构
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
•
•
程序全局区 Program Global Area (PGA):
当服务进程启动时分配。PGA区保存的是某个服务进程私有的数据和 控制信息,它是非共享内存。Oracle中每个服务进程都拥有自己的 PGA区,因此,PGA区也可以看成是服务进程的组成部分之一。
实例内存结构图
系统全局区SGA 共享池Shared pool
• 设置数据库高速缓存的大小
– – DB_BLOCK_SIZE 决定数据库块的大小。 Consists of independent sub-caches: DB_CACHE_SIZE 决定数据库缓存大小 DB_KEEP_CACHE_SIZE 决定KEEP缓存池的大小 DB_RECYCLE_CACHE_SIZE 决定RECYCLE缓存池的大小
共享池 Shared Pool Data Dictionary Cache
在数据库的运行过程中,Oracle会频繁地对数据字典表和视 图进行访问。为提高访问效率,Oracle在共享池的数据字典 缓存中保存最常使用的字典信息。 数据字典缓存的大小由共享池的大小决定。 注:数据字典是Oracle数据库的重要组成部分,是由一组只 读的表以及视图所组成。它可提供有关数据库的信息如下: – Oracle用户名; – 每一个用户所授的特权和角色; – 对象信息(表、视图、快照、索引、同义词、序列、过 程、函数、包及触发器等); – 关于完整性约束的信息; – 列的缺省值; – 有关数据库中对象的空间分布信息及当前使用情况; – 审计信息(如谁存取或修改各种对象) – 其它一般的数据库信息
•
系统全局区 System Global Area (SGA)
•
•
PRE_PAGE_SGA:
oracle实例启动时,会只载入各个内存区最小的大小。而其他SGA内存只 作为虚拟内存分配,只有当进程touch到相应的页时,才会置换到物理内存 中。我们可以通过设置PRE_PAGE_SGA参数,让实例一启动后,所有SGA 都分配到物理内存。 这个参数的默认值为FALSE,即不将全部SGA置入物理内存中。当设置为 TRUE时,实例启动会将全部SGA置入物理内存中。它可以使实例启动达到 它的最大性能状态,但是,启动时间也会更长(因为为了使所有SGA都置入 物理内存中,oracle进程需要touch所有的SGA页)。 SQL> alter system set pre_page_sga=true scope=spfile;
•
系统全局区 System Global Area (SGA)
• • • 在Oracle中,SGA区中数据库缓存、共享池以及大型池的大小 能够在实例的运行过程中动态调整。 参数SGA_MAX_SIZE指定SGA区的最大值。 能够影响SGA区大小的初始化参数主要有以下几个:
– – – – DB_CACHE_SIZE 设置数据库缓存的大小(以KB或MB为单位)。 LOG_BUFFER 设置重做日志缓存的大小(以字节为单位) SHARED_POOL_SIZE 设置共享池的大小(以字节为单位) LARGE_POOL_SIZE 设置大型池的大小(以字节为单位)
Session Stack information space sort area, cursor information SGA
Stack sort area, cursor space information
User process
SGA Session information
Shared SQL areas
Database buffer cache
数据库高速缓存 Database Buffer Cache
• 缓存块的管理方式 – 数据库高速缓存利用最近最少使用算法LRU ( least recently used algorithm)进行管理。
数据库高速缓存 Database Buffer Cache
私有SQL区 程序全局区PGA 会话内存区 排序区
程序全局区 Program Global Area (PGA)
• 程序全局区PGA在专用服务器模式(Dedicated Server)与共享服 务器模式(Shared Server)下的结构。
PGA Server process Dedicated server Shared server
Shared pool Library cache Data dictionary cache
共享池 Shared Pool Library Cache
库缓存用于缓存最近已经解析并执行过的SQL或PL/SQL程序代码: • 共享已缓存的解析代码,提高SQL或PL/SQL程序执行速度。 • 库缓存利用最少使用算法LRU ( least recently used algorithm) 进行管理。 • 库缓存主要包括两个结构: – 共享SQL区 Shared SQL Area – 共享PL/SQL区 Shared PL/SQL Area • 库缓存的大小由共享池的大小决定。
Java池 Java Pool
Java池是SGA区中可选的一个内存结构,主要用于解析Java命令。 在安装或执行Java时需要Java池。 大型池的大小由参数JAVA_POOL_SIZE 设定。
• •
程序全局区 Program Global Area (PGA)
• • 程序全局区PGA是保存每一个连接到Oracle数据库的用户进程和特 定的服务进程的数据及控制信息的内存结构。 程序全局区的大小由参数PGA_AGGREGATE_TARGET 设定
数据库字典 缓存 库缓存 共享SQL区 重做日志高速缓存 PL/SQL过程 与包缓存 锁与其他控 制结构
共享内存
数据库高速缓存
KEEP RECYCLE DEFAULT
其它控制结 构
大型池(可选)
Java池(可选)
软件代码区(Software Code Area) 程序全局区PGA 会话内存区
私有SQL区
Shared SQL areas
软件代码区(Software Code Area)
• 软件代码区是一部分用于存放那些正在运行和可以被运行的代码 (Oracle自身的代码)的内存区。Oracle代码一般存储在一个 不同于用户程序存储区的软件代码区,而用户程序存储区是排他 的、受保护的区域。 软件区的大小一般是固定的,只有Oracle软件升级或重装后才会 改变。在不同操作系统下,这部分区域所要求的大小也不同。 软件区是只读的,可以被安装成共享的或非共享的。可能的情况 下,Oracle代码是共享的,这样所有Oracle用户都可以直接访 问这些代码,而不需要各自保存一份拷贝在自己的内存中。这样 可以节省大量内存并提高整体性能。 而用户程序也可以是共享的或非共享的。一些Oracle工具(如 SQL Plus)能被安装成共享的,但有些不能。如果一台机器运行 多个实例,这些实例可以使用同一个Oracle代码区。 另外要注意的是:并不是所有操作系统都能将软件区安装成共享 的,如Windows。
Database buffer cache
数据库高速缓存 Database Buffer Cache
• 数据库高速缓存的大小能够使用ALTER SYSTEM命令动态进行调整
ALTER SYSTEM SET DB_CACHE_SIZE = 96M;
Database buffer cache
重做日志缓存 Redo Log Buffer Cache
重做日志缓存纪录所有对数据库所作的修改的信息。重做日 志缓存中的内容将被LGWR后台进程随时写入重做日志文件
– 重做日志缓存主要用于数据库的恢复。 – 重做日志缓存的大小由参数LOG_BUFFER设定。
Redo log buffer cache
大型池 Large Pool
大型池是SGA区中可选的一个内存结构。 • 数据库处于共享服务器模式下,一般会配置大型池。 • 在执行某些需要在内存中使用大量缓存的操作时,可以创建 大型池: – 进行数据备份或恢复 – 执行大量排序操作的SQL语句 – 执行并行化的数据操作 • 大型池的大小由参数LARGE_POOL_SIZE设定。 ALTER SYSTEM SET LARGE_POOL_SIZE = 64M;
• •
数据库高速缓存 Database Buffer Cache
是SGA的主要成员,用来存放最近从数据文件中读取得数据 区块副本,或是使用者曾经处理过的资料。其用途在于有效 减少存取资料造成的磁盘读写,进而提高数据的存取效率。 所有用户都可以使用此缓冲区的资料。
Database buffer cache
•
•
共享池 Shared Pool
共享池用于缓存最近执行的SQL或PL/SQL语句,以及最近使用过的与 数据字典相关的数据。 • 共享池中两个关键的内存结构: – 库缓存 Library cache – 数据字典缓存 Data dictionary cache • 共享池初始化参数 SHARED_POOL_SIZE. ALTER SYSTEM SET SHARED_POOL_SIZE = 64M;
–
Database buffer cache
数据库高速缓存 Database Buffer Cache
• 缓存块的类型 – 脏数据块:脏数据块保存的是已经被修改的数据,它们 需要被重新写入数据文件。 – 空闲缓存块:空闲缓存块中不包含任何数据,它们等待 后台进程或服务进程向其中写入数据。 – 命中缓存块:命中缓存块是那些正在被用户访问的,或 者被显式地声明为保留的缓存块。
注:如果初始化参数文件文件中设置的SGA区中各个组件的大小的总和已经超 出了SGA_MAX_SIZE参数的值,则SGA_MAX_SIZE参数将被忽略。 实例运行时动态修改SGA区大小,不能超出SGA_MAX_SIZE参数设置的限制。
系统全局区 System Global Area (SGA)
• SGA所分配的是虚拟内存,但是,在我们配置SGA时,一定要 使整个SGA区都在物理内存中,否则,会导致SGA频繁的页入/ 页出,会极大影响系统性能。 对于OLTP系统,一般的建议是将SGA_MAX_SIZE 设为物理内存 的60%,PGA 设为20%。 但是现在服务器内存是相当大的。 几 百G的内存随处可见。60%也就是几百G内存。 显然这样也是不 合适的。 所以要根据自己系统来设定设定这个值。这个也就所 说的DBA的经验。 这是是需要经验的积累。
排序区
非共享内存
实例内存结构图(Oracle 11g)
系统全局区 System Global Area (SGA)
• SGA主要内存结构: – 共享池 Shared pool – 数据库缓存 Database buffer cache – 重做日志缓存 Redo log buffer – 数据字典缓存 Data dictionary cache 可配置在SGA内的可选择内存结构: – Large pool – Java pool
数据库高速ቤተ መጻሕፍቲ ባይዱ存 Database Buffer Cache
• 数据库高速缓存可以被分为如下3个独立的缓存池
– – KEEP缓存池:KEEP缓存池中的缓存块将始终保留在数据库高 速缓存中,任何情况下都不会被换出。 RECYCLE缓存池:RECYCLE缓存池中的缓存块一旦使用完毕 将被立即换出内存,所以RECYCLE缓存池中的内容是随时更新 的。 DEFAULT缓存池:如果没有为对象指定所使用的缓存池,它们 的缓存块将放置在DEFAULT缓存池中。
– – – 非共享内存区(私有SQL区) 仅仅能被服务进程操作。 包含内容: Sort area:排序需要的空间 Session information:当实例在专用服务器模式工作时,PGA为 用户会话需要设置附加存储,用作专用SQL区和其他信息。 Cursor state:决定一个用户能够使用的私有SQL工作区数目。 Stack space:一个PGA总包含一个栈空间,其空间分配存放会话 变量、数组和其它信息。
Oracle 内存结构和性能
黄老师2013.7
课程内容
• • •
Oracle服务器的内存结构 内存结构与Oracle服务器性能的关系 影响内存结构大小的数据库初始化参数
内存结构
Oracle内存结构从总体上可以分为两部分: • 系统全局区 System Global Area (SGA):
• 在实例启动时分配,是Oracle实例的基础组成部分之一。SGA区位于 共享内存段中,因此SGA区中的数据可以被所有的服务和后台进程共 享。