【赵渝强老师】崖山数据库的体系架构

b438

YashanDB数据库中有数据库和数据库实例这两个基本的概念,并且从体系架构的组成上看,YashanDB数据库又分为了存储结构、进程线程结构和内存结构。因此,要掌握YashanDB的体系架构就需要从数据库与数据库实例入手,并进一步深入到其内部核心的结构中。视频讲解如下:

image.png
点击这里查看视频讲解:【赵渝强老师】崖山数据库的体系架构

一、 数据库与数据库实例

YashanDB数据库,英文名称叫做Yashan Database。这里所说的数据库是一个物理上的概念,即指物理操作系统的文件或者磁盘的集合。换句话来说,YashanDB数据库是由物理硬盘上许多的文件组成。这些文件包含了数据文件、控制文件、重做日志文件等等。数据库的配置信息、日志信息以及表中的数据最终都是存储在这些文件当中。

YashanDB数据库的实例,英文名称叫做Yashan Database Instance,它是一个逻辑上的概念,由操作系统的内存和操作系统中的进程组成。这些内存由同一个宿主机上运行的进程所共享。即使没有磁盘存储的数据库文件,数据库实例也能存在,但是这样的数据库实例没有实际的意义。对于一个正常运行的YashanDB数据库实例来讲,可以把它看成是YashanDB数据库文件在内存中的镜像。客户端需要通过操作系统中的进程来访问内存中的这些镜像,最终读写YashanDB数据库的数据。

在不考虑YashanDB数据库集群的情况下,一般情况下一个YashanDB数据库服务只包括一个YashanDB数据库和一个YashanDB数据库的实例。一个实例对应一个数据库。它们之间的对应关系如下图所示。

二、 存储结构

YashanDB数据库由硬盘上的文件组成,而要读写数据需要通过YashanDB实例来完成。那么,YashanDB数据库是如何存储数据的呢?要搞清楚这个问题,就需要理解什么是YashanDB数据库的存储结构。YashanDB数据库的存储结构是由逻辑存储结构和物理存储结构组成。一般来说数据库无论是关系型数据库,还是NoSQL数据库在存储结构上,都是通过逻辑存储结构来管理物理存储结构。下面分别介绍这两部分。

2.1 YashanDB的逻辑存储结构

从逻辑组成上来看,一个YashanDB数据库是由一个或者多个表空间等组成;一个表空间(tablespace)由一组段组成;一个段(segment)由一组区组成;一个区(extent)由一批数据库块组成;一个数据库块(block)对应一个或多个物理块。如下图所示。

下面分别对这些逻辑单元进行介绍。

2.1.1 Database(数据库)

Database是YashanDB中最大的逻辑单元,它是按照数据结构来组织、存储和管理数据的仓库。所有的表、索引、存储过程、触发器等都被包含在了YashanDB的数据库中。

2.1.2 Tablespaces(表空间)

表空间(Tablespace)是数据库的逻辑划分,一个表空间只能属于一个数据库。表空间对应一个或多个数据文件,通常由相关的段组成。表空间的大小是它所对应的数据文件大小的总和,所有的数据库对象都存放在指定的表空间中。但主要存放的对象是表,所以称作表空间。执行下面的语句可以查看YashanDB中的表空间信息。

$ yasql / as sysdba
SQL> select tablespace_name from dba_tablespaces;

# 输出的信息如下:
TABLESPACE_NAME               
------------------   
SYSTEM                       
SYSAUX                       
TEMP                         
SWAP                         
USERS                        
UNDO                         
					 
6 rows fetched.

# 在YashanDB数据库中,有些表空间必须存在,而有些表空间可以没有。

下表列举了YashanDB数据库中的表空间信息以及它们各自在作用。

2.1.3 Segments(段)

一个段是分配空间时的一个逻辑结构,该逻辑结构可能是表、索引或其他对象存储的一个区域,它是数据库对象使用的空间集合。段可以有表段、索引段、回滚段、临时段和高速缓存段等,而最常用的段就是表段和索引段。下面的语句将查询YashanDB数据库中段的信息。

SQL> select owner,segment_name,segment_type from dba_segments 
     where segment_type ='TABLE' and rownum<5
     union
     select owner,segment_name,segment_type from dba_segments 
     where segment_type ='INDEX' and rownum<5;
	 
# 输出的信息如下:
OWNER              SEGMENT_NAME             SEGMENT_TYPE          
------------------ ------------------------ --------------------- 
MDSYS              SPATIAL_REF_SYS          TABLE                
MDSYS              SPATIAL_REF_SYS_PKEY     INDEX                
SYS                I_OPTSTAT_OPR1           INDEX                
SYS                I_OPTSTAT_TASK1          INDEX                
SYS                I_OPTSTAT_TASK2          INDEX                
SYS                MON_MODS_ALL$            TABLE                
SYS                TABLE_PRIVILEGE_MAP$     TABLE                
SYS                YLS$PROPS                TABLE                

8 rows fetched

# 这里只显示了YashanDB数据库中部分段的信息。

2.1.4 extents(区)

区是数据库存储空间分配的一个逻辑单位,它由连续数据块所组成。每一个段是由一个或多个区组成。当一个段中间所有使用的区空间已完全使用,YashanDB数据库为该段重新分配一个新的范围,即:分配一组新的区来存储段中的数据。

2.1.5 Data Block(数据块)

数据块是YashanDB数据库管理的最小逻辑存储单位,它也是数据库使用的I/O最小单位, 即:一次I/O读写的数据量大小。数据块的大小由db_block_size参数确定。数据块是处理YashanDB数据库更新、查询或者插入数据时的最小单位。当用户从表中读取数据时,I/O操作将从数据库文件中以数据块为单位读取或者写入数据YashanDB数据库默认的数据块的大小为8 KB,即使只想检索4 KB的数据,也需要读取8 KB的数据量。通过下面的语句查看当前数据块设置的大小:

SQL> show parameter db_block_size

# 输出的信息如下:
NAME                 VALUE     
-------------------- --------- 
DB_BLOCK_SIZE        8192     

1 row fetched.

2.2 YashanDB的物理存储结构

YashanDB的物理存储结构就是指的YashanDB数据库在硬盘上存储的各种文件,包括:数据文件、联机日志文件、控制文件、归档日志文件、参数文件、告警日志文件、跟踪文件和备份文件等。下面分别介绍这些文件以及它们的作用。

2.2.1 数据文件(Data File)

一个数据库由多个表空间组成,而表空间可以由多个数据文件组成的,数据文件是真正存放数据库数据的。一个数据文件就是一个硬盘上的文件。表和索引中的数据在物理上是被存放在数据文件中的。当查询表中数据的时候,如果内存中没有该表的数据,那么YashanDB数据库的服务器进程将读取该表所在的数据文件,然后把数据存放到内存中。通过下面的语句可以查看当前数据库中存在的数据文件和对应的表空间:

SQL> select file_name,tablespace_name from dba_data_files;

# 输出的信息如下:
FILE_NAME                                              TABLESPACE_NAME   
------------------------------------------------------ ----------------- 
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/system    SYSTEM           
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/sysaux    SYSAUX           
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/temp      TEMP             
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/swap      SWAP             
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/users     USERS            
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/undo      UNDO             

6 rows fetched.

当表空间中的数据文件写满时,可以通过下面的语句往表空间中添加新的数据文件。例如,往users表空间中添加一个10M大小的数据文件。

SQL> alter tablespace users 
     add datafile '/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/users02' 
     size 10M;

执行下面的语句重新查看YashanDB数据库的数据文件信息:

SQL> select file_name,tablespace_name from dba_data_files;

# 输出的信息如下:
FILE_NAME                                               TABLESPACE_NAME   
------------------------------------------------------- ----------------- 
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/system     SYSTEM           
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/sysaux     SYSAUX           
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/temp       TEMP             
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/swap       SWAP             
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/users      USERS            
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/undo       UNDO             
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/users02    USERS            

7 rows fetched.

2.2.2 重做日志文件(Redo Log File)

一个数据库可以有多个联机重做日志文件,它记录了数据库的变化。例如,当YashanDB数据库产生异常时,导致对数据的改变没有及时写入到数据文件中。这时YashanDB数据库就会根据联机重做日志文件中的信息来获得数据库的变化信息,并根据这些信息把这些改变写到数据文件中。换句话来说,联机重做日志文件中记录的重做日志可以用来进行数据库实例的恢复。下图展示了YashanDB数据库写入数据的过程。

从上图可以看出,当前客户端成功提交事务时,数据有可能还没有写到数据文件上。如果此时数据库实例发生了崩溃,写入的数据是会丢失的。当重新启动数据库实例时,YashanDB会利用成功写入的重做日志来恢复实例在内存中的数据,这个过程叫做实例恢复。由YashanDB数据库的SMON进程自动完成。通过下面的语句查看当前YashanDB数据库中存在的联机重做日志文件和对应的日志组信息。

SQL> select id,name,status from v$logfile;

# 输出的信息如下:
ID NAME                                                STATUS    
-- --------------------------------------------------- --------- 
 0 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo1  INACTIVE 
 1 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo2  INACTIVE 
 2 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo3  CURRENT  
 3 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo4  INACTIVE 

4 rows fetched.

下表说明了重做日志文件不同状态的含义。

下面是关于重做日志文件的一些基本操作。
(1)添加新的重做日志文件。

SQL> alter database add logfile ('redo5' size 200m);

(2)重新查询已存在的重做日志文件。

SQL> select id,name,status from v$logfile;

# 输出的信息如下:
 ID NAME                                                 STATUS    
--- ---------------------------------------------------- --------- 
  0 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo1   INACTIVE 
  1 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo2   INACTIVE 
  2 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo3   CURRENT  
  3 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo4   INACTIVE 
  4 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo5   NEW      

5 rows fetched.

(3)切换重做日志文件。

SQL> alter system switch logfile;

(4)重新查询已存在的重做日志文件。

SQL> select id,name,status from v$logfile;

# 输出的信息如下:
 ID NAME                                                 STATUS    
--- ---------------------------------------------------- --------- 
  0 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo1   INACTIVE 
  1 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo2   INACTIVE 
  2 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo3   ACTIVE   
  3 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo4   INACTIVE 
  4 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo5   CURRENT  

5 rows fetched.

(5)触发一个检查点,并重新查询已存在的重做日志文件。

SQL> alter system checkpoint;
SQL> select id,name,status from v$logfile;

# 输出的信息如下:
 ID NAME                                                  STATUS    
--- ----------------------------------------------------- --------- 
  0 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo1    INACTIVE 
  1 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo2    INACTIVE 
  2 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo3    INACTIVE 
  3 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo4    INACTIVE 
  4 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo5    CURRENT  

5 rows fetched.

2.2.3 控制文件(Control File)

一个数据库至少要有一个控制文件,控制文件中存放了YashanDB数据库的物理结构信息。这些物理结构信息就包括:
(1)数据库的名字。
(2)数据文件和联机日志文件的名字及位置。
(3)创建数据库时的时间戳。
(4)备份的元信息。

YashanDB数据库在启动过程中,会根据控制文件中记录的数据文件和联机重做日志文件的位置信息来打开数据库。由于控制文件非常重要,为了更好的保护数据库,通常在执行数据库备份时是需要备份控制文件的。可以通过下面的语句查看当前存在的控制文件。

SQL> select name from v$controlfile;

# 输出的信息如下:
NAME                                                             
---------------------------------------------------------------- 
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/ctrl1              
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/ctrl2              
/home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/ctrl3              

3 rows fetched.

可以看到在默认情况下,YashanDB数据库有三个控制文件,这三个控制文件的内容是一样的。这样的方式称之为控制文件的多路复用。即使其中的一个控制文件出现了问题,YashanDB数据库也可以使用另一个控制文件。这样也不会因为数据库的损坏从而造成数据的丢失。

2.2.4 归档日志文件

归档日志文件是联机重做日志文件的副本,它也记录了对数据库改变的历史。下面的语句将查看当前数据库的日志模式。

SQL> select log_mode from v$database;

# 输出的信息如下:
LOG_MODE          
----------------- 
ARCHIVELOG       

1 row fetched.

YashanDB数据库默认是归档模式。在归档模式下,YashanDB可以执行数据库的联机备份,或者叫做数据库的热备份;而在非归档模式下,YashanDB只能执行数据库的离线备份,或者叫做数据库的冷备份。

2.2.5 参数文件

配置参数文件是名为yasdb.ini的文本文件,存放在$YASDB_DATA/config路径下,产品安装时所指定的数据库初始配置参数将保存在此文件中,后续数据库运行过程中对配置参数的非memory修改也将持久化到此文件中。下面展示了参数文件的内容:

$ pwd
/home/yashan/yasdb/yasdb_data/db-1-1/config

$ cat yasdb.ini 

# 输出的信息如下:
_CLUSTER_ID=2fd38e8003d1f864a081f24c187d4b2e
NODE_ID=1-1:1
CONTROL_FILES=('?/dbfiles/ctrl1', '?/dbfiles/ctrl2', '?/dbfiles/ctrl3')
ARCH_CLEAN_IGNORE_MODE=BACKUP
CGROUP_ROOT_DIR=/sys/fs/cgroup
LISTEN_ADDR=192.168.79.10:1688
REPLICATION_ADDR=192.168.79.10:1689
RUN_LOG_FILE_PATH=/home/yashan/yasdb/log/db-1-1/run
RUN_LOG_LEVEL=INFO
SLOW_LOG_FILE_PATH=/home/yashan/yasdb/log/db-1-1/slow
CHARACTER_SET=UTF8
TIME_ZONE = +08:00
DATA_BUFFER_SIZE = 512M
CHECKPOINT_TIMEOUT = 300

2.2.6 密码文件

密码文件是名为yasdb.pwd的文本文件,不可直接进行编辑,其路径受PASSWORD_FILE参数控制。该文件用于存储SYS用户的密码。

SQL> show parameter PASSWORD_FILE;

# 输出的信息如下:
NAME              VALUE                   
----------------- ----------------------- 
PASSWORD_FILE     ?/instance/yasdb.pwd   

1 row fetched.

# 密码文件内容为加密后信息,虽然为文本文件,但不能直接修改里面的内容。

2.2.7 告警日志文件

告警日志文件按照时间的先后顺序,记录了数据库的重大活动和所发生的错误信息以及警告信息。因此,当YashanDB数据库出现任何问题的时候,首先就应当检查告警日志文件。警报文名字的格式是alert.log。警报文件的位置默认保存在了存放在$YASDB_DATA/log/alert目录下,如下所示:

$ pwd
/home/yashan/yasdb/yasdb_data/db-1-1/log/alert

$ tail alert.log 

# 输出的信息如下:
2025-12-03 15:35:11.569|12|Incident|0|0||the incident was controlled by flood, problem id=4, last incident id=77
2025-12-03 15:45:38.294|12|Incident|0|0||the incident was controlled by flood, problem id=6, last incident id=80
2025-12-03 15:54:53.672|12|Incident|0|0||the incident was controlled by flood, problem id=1, last incident id=82
2025-12-03 17:10:29.602|12|Incident|0|0||the incident was controlled by flood, problem id=1, last incident id=87
2025-12-03 17:58:03.305|12|Incident|0|0||the incident was controlled by flood, problem id=1, last incident id=90
2025-12-03 18:11:16.950|12|Incident|0|0||the incident was controlled by flood, problem id=1, last incident id=91
2025-12-04 15:00:03.294|12|Incident|0|0||the incident was controlled by flood, problem id=1, last incident id=96
2025-12-04 15:50:00.629|12|Incident|0|0||the incident was controlled by flood, problem id=3, last incident id=107
2025-12-04 15:52:31.697|12|Incident|0|0||the incident was controlled by flood, problem id=2, last incident id=116
2025-12-04 15:52:32.767|12|Incident|0|0||the incident was controlled by flood, problem id=5, last incident id=118

2.2.8 跟踪文件

跟踪文件是每个YashanDB数据库服务器进程都有的日志文件。当数据库运行中出现问题时,通过查看跟踪文件中的内容可以帮助诊断YashanDB数据库的问题。因为每个服务器进程都会将错误信息写到跟踪文件中。因此,数据库管理员DBA就可以根据跟踪文件的信息来查看进程中所发生的错误。在默认情况下,YashanDB数据库的跟踪文件的位置保存在$YASDB_DATA/diag/trace/目录下。

2.2.9 备份文件

备份文件就是在数据库发生介质损坏的时候用来还原(Restore)数据库并执行恢复(Recover)数据的文件。

三、 进程线程结构

YashanDB实例启动后,创建YASDB进程处理连接到数据库实例的客户端进程的请求。YASDB进程主要包含后台线程以及处理客户请求的工作线程。因此,YashanDB采用的是多线程架构,这样可以充分利用多核处理器的计算能力,提高系统的并发性和响应性。在多线程架构中,由一个主线程负责程序的初始化和协调工作,然后创建多个子线程来执行具体的任务。每个线程可以独立地执行特定的代码块,但它们共享进程的资源和内存空间。通过下面的步骤能够确定YashanDB数据库实例的进程信息和包含的线程信息。

(1)确定YASDB进程的PID。

$ ps -ef|grep yasdb

# 输出的信息如下:
yashan 45244 ... /home/yashan/yasdb/23.4.1.102/bin/yasdb open -D /home/yashan/yasdb/yasdb_data/db-1-1

# 这里的45244是YASDB的进程PID。

(2)确定YASDB进程所包含的线程信息。

$ top -H -p 45244

# 输出的信息如下:
......
PID   USER   ...... COMMAND            说明     
45300 yashan ...... MMON               AWR快照自动管理线程        
45244 yashan ...... yasdb              主线程          
45245 yashan ...... TIMER              逻辑时钟线程       
45246 yashan ...... BUFFER_POOL        BUFFER_POOL辅助线程  
45247 yashan ...... PRELOADER          冷数据表扫描预读线程    
45248 yashan ...... PRELOADER       
45249 yashan ...... SMON               系统监控线程       
45250 yashan ...... CKPT               检查点任务调度线程         
45251 yashan ...... DBWR               数据脏块刷新线程         
45252 yashan ...... DBWR            
45253 yashan ...... SCHD_TIMER         高精度定时器线程     
45254 yashan ...... REPL_TCP_LSNR      HA监听线程   
45260 yashan ...... LISTENER_LOG       监听日志线程   
45261 yashan ...... UDS_LSNR           本地网络监听线程        
45262 yashan ...... TCP_LSNR           TCP监听线程      
45263 yashan ...... RD_ARCH            归档文件传输线程   
45264 yashan ...... ARCH_DATA          归档文件清理线程  
45265 yashan ...... HEALTH_MONITOR     健康检查监控线程
45291 yashan ...... HOT_CACHE_RECYC    热块回收线程
45292 yashan ...... LOGW               redo刷盘线程        
45299 yashan ...... XFMR               后台转换任务调度线程      
45301 yashan ...... JOB_QUEUE          JOB的执行线程
45303 yashan ...... XFMR_WORKER_0      LSC后台转换任务执行线程  

四、 内存结构

YashanDB数据库的内存结构可以看成是数据库文件的镜像,而每个YashanDB数据库实例有两个关联的内存结构:共享内存区域(SGA,Shared Global Area)和私有内存区域(SPA,Session Private Area)。

  • 共享内存区域是一组所有后台线程以及会话能够共享访问的内存结构,例如数据缓存、SQL缓存、数据字典缓存等。
  • 私有内存区域是会话独占和管理的内存区域,例如会话栈内存、会话堆内存。

下图展示了YashanDB数据库实例的内存结构。

4.1 共享内存区域(SGA)

共享内存区域(SGA,Shared Global Area)一般共享给多个会话或线程使用,主要包括内存共享池(SHARE POOL)、数据缓存(DATA BUFFER)、有界加速缓存(AC BUFFER)以及虚拟内存(VIRTUAL MEMORY)。通过下面的语句可以查看共享内存区域中的缓冲池:

SQL> select * from v$sga;

# 输出的信息如下:
NAME                                               SIZE 
--------------------------------- --------------------- 
data buffer                                   536870912
temporary buffer                              134217728
large pool                                    134217728
redo buffer                                    67108864
hot cache                                      16777216
share pool                                    335544320
global application pool                        16777216
dbwr buffer                                     8404992
job pool                                        4194304
audit queue buffer                             16777216

10 rows fetched.

下面分别介绍其中的主要缓冲池的功能和作用。

4.1.1 内存共享池(SHARE POOL)

内存共享池包含多个内存区域,执行下面的语句可以进行查看:

SQL> select name,sum(size) from v$share_pool group by name;

# 输出的新如下:
NAME                                SUM(SIZE) 
--------------------------------- ----------- 
SQL POOL                            201326448
DICTIONARY CACHE POOL                67108864
LOCK POOL                            33554432
CURSOR POOL                          33554432
DSTB POOL                                   0
RECOVERY BUDDY POOL                         0
BLOCK RES POOL                              0
NON BLOCK RES POOL                          0
GRC REQ POOL                                0
GCS PC  POOL                                0
GRC OBJECT POOL                             0
GLS POOL                                    0
STREAM POOL                                 0
FREE POOL                                 144

14 rows fetched.

这里最主要的就是SQL POOL,它表示SQL的缓存。该内存区域用户保存SQL解析树和执行计划。SQL引擎在执行语句时,首先会匹配SQL缓存,如果存在相同语句则无需编译直接使用已编译的执行计划,从而避免硬解析,节省开销。下面通过一个简单的示例来说明SQL POOL的功能。

(1)使用scott用户登录YashanDB数据库实例。

$ yasql scott/tiger

(2)执行下面的SQL语句三次。

SQL> select count(empno) from emp;
SQL> select count(empno) from emp;
SQL> select count(empno) from emp;

(3)切换到管理员用户监控SQL POOL中的信息。

SQL> select sql_text,parse_calls,loads,executions 
     from v$sql where sql_text like '%count(empno)%';

# 输出的信息如下:
SQL_TEXT                            PARSE_CALLS   LOADS   EXECUTIONS 
--------------------------------- ------------- ------- ------------ 
select count(empno) from emp                  3       1            3

# 从输出的信息可以看出,
# 该条SQL语句被加载了1次、解析了3次(其中1次为硬解析,2次为软解析)
# 并执行了3次。

4.1.2 数据缓存(DATA BUFFER)

数据缓存用于缓存当前或最近使用的从磁盘读取的数据块的拷贝,可优化数据库的I/O减少物理读/写。采用LRU算法管理,当缓存区域内存不足、需要回收内存以重用时,选择一些最长时间未使用的缓存块进行淘汰回收。数据缓存分为行数据缓存和列数据缓存,行数据缓存用于存放行表相关的数据块拷贝,列数据缓存用于存放列表相关的数据块拷贝。

4.1.3 有界加速缓存(AC BUFFER)

有界加速缓存类似于数据缓存,但缓存的对象不同,有界加速缓存只存放基于有界理论的AC对象。

4.1.4 虚拟内存(VM,VIRTUAL MEMORY)

虚拟内存主要是由需要物化数据的SQL算子使用,且在物化对象过大时将磁盘作为虚拟内存使用。虚拟内存又分为行虚拟内存和列虚拟内存,相关SQL算子计算行存表数据时使用行虚拟内存,计算列存表数据时使用列虚拟内存。

4.2 私有内存区域(SPA)

私有内存区域(SPA,Session Private Area)是每个会话创建时分配的独占内存区域,与共享内存区域不同,此区域的内存由会话独占和管理,会话退出时释放,该内存区域主要是满足SQL执行时的各种内存空间需求。该区域主要包括两部分:

  • 会话栈内存:该区域一般用于存放会话执行过程中临时使用的局部变量等。
  • 会话堆内存:该区域一般用于存放生命周期较长的运行期数据。

通过下面的语句可以查看每个会话的SPA的内存区域。

SQL> select type,sum(use_size) from V$SESSION_SPA group by type;

# 输出的信息如下:
TYPE                              SUM(USE_SIZE) 
--------------------------------- ------------- 
vm buffer pool                                0
large pool                                    0
app pool                                      0
pq pool                                       0
columnar vm buffer pool                       0
posted @ 2026-04-08 09:33  赵渝强老师  阅读(7)  评论(0)    收藏  举报