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

YashanDB数据库中有数据库和数据库实例这两个基本的概念,并且从体系架构的组成上看,YashanDB数据库又分为了存储结构、进程线程结构和内存结构。因此,要掌握YashanDB的体系架构就需要从数据库与数据库实例入手,并进一步深入到其内部核心的结构中。视频讲解如下:
![]() |
|---|
| 点击这里查看视频讲解:【赵渝强老师】崖山数据库的体系架构 |
一、 数据库与数据库实例
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


浙公网安备 33010602011771号