暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

Oracle体系结构学习之实例结构(一):内存结构

原创 lmj 2022-01-05
954
知识积累
  • buffer :数据库缓冲区中内存块的大小,和数据库数据文件的块的大小完全一致;是database buffer cache里分配的最小单位

  • 数据库缓冲区存在的目的:

    • 做的所有的操作都是在内存里;
    • 优化物理 I/O(内存的读写效率要远远高于磁盘的IO)
    • 能够缓存经常被访问的数据块,提高数据处理的效率。
  • Buffer States:

    • unused: 未被使用的 ##一次也未被使用的
    • clean: 干净的 ##说明buffer里面的数据信息和数据文件对应的数据块的存储内容是一致的
    • dirty: 脏块 ##说明buffer里面的数据信息和数据文件对应的数据块的存储内容不一致
  • 每个buffer的访问模式:

    • pinned:就是这个buffer正在被读或者写;
    • free:空闲状态
  • Buffer Modes:

    • Current mode:当前模式。
      A current mode get, also called a db block get, is a retrieval of a block as it currently appears in the buffer cache
    • Consistent mode:一致性模式。(read)
      A consistent read get is a retrieval of a read-consistent version of a block. This retrieval may use undo data.

一、SGA

System Global Area(系统全局区)

  • 是共享的,是所有使用当前实例的用户都可以读取的内存部分
  • 由内存组成,其中存储数据、用户信息和控制信息等
  • 一个SGA只能服务一个实例,多实例间不能互相访问SGA
  • 实例关闭的时候,系统回收内存,SGA即消失

1.1 fixed sga - 固定SGA

固定SGA 是内部的内务管理区域。例如,固定SGA 包含:1)有关数据库及其实例状态的一般信息,后台进程需要访问这些信息2)进程间通讯的信息,如有关锁的信息。

固定 SGA 的大小由 Oracle server设置,且不能手动更改。固定SGA 大小可能会因为版本不同而不同。

1.2 Redo buffer - 重做缓冲区

如果数据需要写到在线重做日志中,则在写磁盘前要在redo buffer中临时缓存这些数据。

redo log buffer

  • 是SGA当中的一个循环使用的buffer,存放描述数据块变化的redo entries。(redo entries包含用于重建、重做和dml或者ddl语句所造成的数据库的变化的信息)
  • 实现先记录日志, 然后再修改数据,保证数据的一致性;
  • 重做记录并不直接写入磁盘的重做日志文件,而是先写入重做日志缓存,当重做日志缓存中的重做记录达到一定数量时,由(日志写入进程)LGWR进程写入重做日志。(先内存后磁盘)

1.3 Block buffer cache - 块缓冲区缓存

  • 默认池(default pool):所有段块一般都在这个池中缓存。如果没有做任何特殊配置,那么数据块默认被cache到default buffer pool;

  • 保持池(keep pool):将一些频繁被访问的表,固定在数据库缓冲当中,不会因为缓冲区不足,而被置换出内存;

  • 回收池(recycle pool):缓存某些不被经常访问的表,被cache,access之后,马上置换出内存;

  • nK:非标准块的缓冲区大小,主要用于从一个数据库向另一个数据库传输数据(传输表空间)

分类目的:保证数据文件的数据块的大小要和buffer的大小保持一致;

Least Recently Used (LRU) List :按照buffer被访问的频率排列,如果需要free buffer就从LRU中找

1.4 Shared pool - 共享池

共享池:缓存不同类型的程序数据

image-20220105163733672

  • Library Cache

    • The library cache is a shared pool memory structure that stores executable SQL and PL/SQL code.

    • 库缓存,缓存了可执行的sql和pl/sql代码

    • 软解析:数据库趋向于使用已经解析过,存放在库缓存中的sql代码。重用库缓存中的sql code的过程,称为soft parse(软解析);

    • 硬解析:反之,如果不能重用library cache中的sql code,那么,称之为hard parse(硬解析);

      解析:通过sql语句的执行过程,来描述解析的概念:
      1.查看sql的语法,语义部分;例如:select employee_id,salary from hr.employees;
      2.将这个sql做hash运算,变成一段hash代码;
      3.用这个hash值,去shared pool里面的library cache找, 查找是否有相同的hash值
      –如果存在,说明这条语句被执行过,直接重用这个执行代码就好了;
      –如果不存在,需要解析这条语句:oracle server需要根据这条语句的具体相关信息,找出一个最优化的执行计划;

  • Data Dictionary Cache:数据字典缓存,数据字典的元数据信息

  • Server Result Cache:服务器结果缓存–11g新特性,可以手动设置缓存哪些sql

  • Reserved Pool:保留池,常驻shared pool 里

    • 解决内存碎片而无法分配足够的内存空间的问题:

    • 当shared pool中的chunk被用的都只剩一小部分,而无法在放大的解析结果数据的时候,此时启用Reserved Pool中的chunk;

      chunks:shared pool由许多内存块组成,这些内存块通常称为chunk。
      chunk是shared pool中内存分配的最小单位,一个chunk中的所有内存都是连续的。

查看sql相关信息:

select sql_text,sql_id,parse_calls, executions from v$sql where sql_text like '%insert into t values%';

共享sql设置方法: --减少硬解析
1、统一书写格式
2、使用绑定变量

查看解析信息的数据字典:

SYS@prod>select name,value from v$sysstat where name like 'parse%'; NAME VALUE ------------------------------ ---------- parse time cpu 7368 parse time elapsed 15961 parse count (total) 84452 parse count (hard) 9464 parse count (failures) 354 parse count (describe) 138 6 rows selected.

1.5 Large pool - 大池

大池:主要是用来处理并行的时候使用。是一个可选的内存区域,它所提供的内存分配往往比共享池分配的内存更大。

应用场景:

  • 共享服务器的UGA,和 Oracle XA接口 (用于与多个数据库进行交互事务的外部接口)
  • 并行执行语句中使用的消息缓冲区
  • 恢复管理器 (RMAN) I/O 从属进程的缓冲区

通过从大池中为共享SQL分配会话内存,数据库可以避免由收缩共享 SQL 缓存引起的性能开销。通过为 RMAN 操作、I/O 服务器进程、和并行缓冲区等分配大的缓冲区内存,大池可以比共享池更好地满足大型内存请求

image-20220105163859606

并行:一个任务多个进程同时执行
并发:同时访问某一服务

1.6 java pool - Java池

Java池:用来解析java代码的

Java 池是一个存储Java 虚拟机 (JVM) 内所有会话特定的 Java 代码和数据的内存区。此内存包括在调用端迁移到 Java 会话空间的Java 对象

1.7 stream pool - 流池

流池:在使用stream流复制的时候使用。用于缓存流进程在数据库间移动或复制数据时使用的的队列消息,并为Oracle流的捕获进程和应用进程提供内存。

  • 流池专门由Oracle 流使用。
  • 如果您没有专门配置流池,则其大小从零开始。
  • 流池的大小由Oracle 流按需动态增长。

1.8 Sort Extent Pool

Sort Extent Pool:在内存中保存临时段

在这个表空间中创建的临时段不会在排序的结束的时候取消分配。 而是记为空闲,
不放回空闲列表,并保留再利用。

1.9 Flashback Buffer

Oracle 10g开始,如果数据库启用flashback功能,Oracle即在SGA中分配flashback buffer(闪回缓冲区)
闪回缓冲区中(Flashback Buffer)按照一定的时间间隔存储的变化数据

二、PGA和UGA

2.1 定义

Process Global Area - 进程全局区(也称私有全局区):操作系统进程或线程专用的内存,不允许系统中的其他进程或线程访问
PGA 是一个非共享的内存区域,其中包含专门供server process进程使用的数据和控制信息。

User Global Area - 用户全局区: 是与某个用户会话相关联的内存区,UGA 是为会话变量分配的会话内存,如登录信息和数据库会话所需的其他信息。

UGA 必须在数据库会话的整个存活期间是可用的

2.2 根据oracle服务器的连接模式分类

2.2.1 dedicated server - 专用服务器

如果是dedicated server,那么oracle会为每一个用户的请求,分配一个server process(服务器进程),分配进程的同时为这个进程分配内存空间,即PGA。这时PGA和UGA存放在一起。

1)PGA包含的内容:

image-20220105170256098

  • SQL Work Areas:
    • Sort Area:order by会在这个区域进行
    • Hash Area:多表连接的时候,hash连接做hash运算
    • Bitmap Merge Area:位图合并区域
  • Private SQL Area:私有SQL 区保存了有关某个已解析的 SQL 语句的信息,和其它特定会话的信息;
    • Persistent Area:绑定变量的信息
    • Runtime Area :查询执行状态信息
  • Session Memory: UGA

2)PGA的作用:

  • 保存用户的连接信息和绑定变量的信息,查询执行状态信息
  • 保存用户权限等重要信息,当用户进程和数据库建立会话的时候,系统(server process)会将这个这个用户的相关权限查询出来,然后保存在这个会话区域内;
  • 当需要排序的时候,或是要建立大的索引的时候,会在PGA里的sort area里进行排序, 如果内存空间放不下排序的数据大小,超出部分就会在临时表空间内完成。
2.2.2 shared server - 共享服务器

如果是shared server,默认放置到shared pool,如果配置了large pool,那么UGA会在SGA中的large pool当中。此时任何共享服务器进程都能访问,而server process进程是有一定数量的, 轮流处理每个用户的相应请求,而不是某个用户专用的

最后修改时间:2022-01-05 17:22:38
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论