每个 Oracle 数据库实例都会在内存中分配一个很大的内存结构,
称为系统全局区(System Global Area),
这是一个大型的共享内存结构,每个Oracle进程都会访问它。
在Linux/Unix操作系统上,SGA是一个物理实体,使用操作系统命令能“看到它”。
它被操作系统物理地划分为一个共享内存段,进程可以附加到这段独立的内存上。
咱们可以把SGA想象成燃油汽车的前置仓,在这个前置仓里面会有发动机,变速器、发电机、轴转动等各种组件。
SGA也是可以脱离Oracle进程而独立存在的内存结构,
就像即使发动机,变速器、发电机、转轴等不安装到前置仓里面,前置仓也可以独立存在。
但是,在实际生产环境中,如果真的只有 SGA 而没有任何 Oralce 进程存在,
那说明数据库已经以某种方式崩溃了,
这种情况类似燃油汽车出故障停止运转了,但是前置仓依然存在。
在UNIX/Linux系统中,Oracle数据库通常以多个进程的形式运行,
其中包括了前台和后台进程,以及分配给SGA的共享内存区域。
这意味着SGA在物理内存中是一个独立的共享内存段,可以通过特定的命令和工具查看和管理。
要在Linux中查看 SGA ,我们可以通过 ipcs -m | grep ora 命令:
[root@localhost ~]# ipcs -m | grep ora
0x00000000 2 oracle 600 10485760 84
0x00000000 3 oracle 600 8573157376 84
0x00000000 4 oracle 600 8388608 84
0x4bba7b74 5 oracle 600 81920 84
[root@localhost ~]#
由于不同操作系统在进程模型上的差异,Oracle数据库的工作方式和内存管理方式是有所不同的。
在Windows系统中,无法像UNIX/Linux.上那样把SGA看成一个实体。
这是由于在Windows平台上,Oracle数据库通常以一个单独的进程【oracle.exe】的形式运行,
该进程拥有Windows单独分配的内存地址空间,SGA会被分配到这个进程的私有内存中。
这使得SGA在Windows中看起来更像是进程的一部分,而不是一个独立的共享内存段。
如果使用Windows Task Manager(任务管理器)或其他性能工具,
则可以看到操作系统给 oracle.exe总共分配了多少内存空间,
显示【oracle.exe】 进程的总内存使用量,
但无法以与UNIX/Linux中相同的方式区分SGA和其他进程内存。
正是因为在操作系统层面存在这种差异,为了更加精细化的管理和查看 SGA,
Oracle在数据库内部提供了自己的动态性能视图【v$sgastat】,以帮助管理和监视SGA的性能和使用情况。
SQL> compute sum of bytes on pool
SQL> break on pool skip 1
SQL> select pool,name,bytes from v$sgastat order by pool,name;
POOL NAME BYTES
-------------- -------------------------- ----------
java pool free memory 100663296
************** ----------
sum 100663296
large pool PX msg pool 9437184
free memory 24117248
************** ----------
sum 33554432
shared pool kghrcx RO latch director 16
1105.kgght 36784
POOL NAME BYTES
-------------- -------------------------- ----------
shared pool 11G QMN so 7000
1:kngisga 32152
343.kgght 36784
358.kgght 7992
432.kgght 36784
435.kgght 36784
438.kgght 36784
441.kgght 36784
444.kgght 36784
447.kgght 36784
450.kgght 36784
POOL NAME BYTES
-------------- -------------------------- ----------
shared pool 453.kgght 36784
615.kggec 549328
6248.kgght 167160
6249.kgght 167160
6250.kgght 167160
ADR_CONTROL 3264
ADR_CONTROL_AUX 1920
ADR_INVALIDATION 1536
AQ Message cache driver s 190880
AQ Propagation Scheduling 64000
AQ Slave list 8680
POOL NAME BYTES
-------------- -------------------------- ----------
shared pool AQ coordinator job list 4144
AQ skiplist state object 63672
AQ: Master/Slave state ob 55440
AQ: Non Durable Sub state 109152
ASH buffers 12582912
ASM KFFD SO 2992
ASM SR state object 35224
ASM connection state 364464
ASM generic network state 2736
ASM kfk state object 3760
ASM map operations 3760
POOL NAME BYTES
-------------- -------------------------- ----------
shared pool ASM rcl group 91560
ASM rollback operations 4272
ASM scan context 2736
ASMCMD BG process 3504
AW SGA 40
AWR Data Source Info (KEW 8
AWR Flushing Error Contro 80
AWR Table Info (KEW layer 3048
AWR View Info (KEW layer) 160
Active Session History - 1528
Alert log 520
POOL NAME BYTES
-------------- -------------------------- ----------
shared pool Allocate KPDB Hash Table 8192
Array of TopN Table delta 16
Array of cached attr 400
Auto BMR for File Header 56
Auto tune undo info 96
Autotask Error Control in 80
BRANCH TABLE SEGMENTED AR 226192
Background process state 48
Backup Appliance state ch 3760
Banner Storage 2048
Big SQL Shared Memory SO 3064
POOL NAME BYTES
-------------- -------------------------- ----------
shared pool Block List 2232032
CGS system incarn array 24864
Checkpoint queue 3456
Cleanup state objects 1536
Client ID trace setting h 536
Client ID trace settings 4016
Closed Thread SCN Bitvec 33792
Context of deferred reuse 2560
Core dump directory 520
DBWR array of pointers to 8
DBWR event stats array 232
POOL NAME BYTES
-------------- -------------------------- ----------
shared pool DDE_USER_ACTION 2496
DDE_USER_ACTION_DEF 2880
DDE_USER_ACTION_PARAMETER 4608
DDE_USER_INCIDENT_ACTION_ 1536
DDE_USER_INCIDENT_TYPE 1536
DFW_CONFIG_CAPTURE 1728
DFW_CONFIG_ITEM 2112
DFW_PATCH_CAPTURE 1728
DFW_PATCH_ITEM 1920
DFW_PURGE 3648
DFW_PURGE_ITEM 2880
POOL NAME BYTES
-------------- -------------------------- ----------
shared pool DISPATCHER CONFIG ENTRY 120
DISPATCHER CONFIG TABLE 2048
DISPATCHERS INFO 2632
DML lock 3336432
DNFS Disp Cle q Rec 56
DNFS Disp Com q Rec 48
DNFS Disp Iss q Rec 40
DNFS Disp cleanup ctx 24
DNFS Disp comp array 24000
DNFS Disp comp array coun 6000
DNFS Disp context 64
POOL NAME BYTES
-------------- -------------------------- ----------
shared pool DNFS Disp context arr 8
DNFS Disp spawn ctx 24
DTP proc structure alloc 39088
Database type info cache 32
Dep type array 56
Detached dump directory 520
EM_DIAG_JOB 2880
EM_TARGET_INFO 2688
EM_USER_ACTIVITY 2688
ENQUEUE FREELISTS 1104
ENQUEUE STATS 43416
POOL NAME BYTES
-------------- -------------------------- ----------
shared pool Entity type array 56
Exadirect acl 3240
Expression usage element 2816
External table user state 116136
FileIdentificatonBlock 906904
FileOpenConsolidatedBlock 265488
Fixed UGA alloc ctx 56
Fxd UGA kghx lists 8
Fxd UGA latch array 160
Fxd UGA latch ptrs 8
Fxd UGA opcode array 8
POOL NAME BYTES
-------------- -------------------------- ----------
shared pool Fxd UGA recovery ptrs 8
Global Context Heap descr 400
Global dictionary parent 163840
Global dictionary read-wr 163840
HM Hang Stats 6272
HM Lcl Sess Info 401024
HM PC Rank 256
HM RSLN RC 3712
HM SGA context 78816
HM SGA init var 32
HM SGA kjzs ctx 24
............
行数过多,中间省略
............
POOL NAME BYTES
-------------- -------------------------- ----------
shared pool v_inccount 1536
v_incfcount 1728
v_ipsprbcnt 1536
v_ipsprbcnt1 1536
v_nfcinc 2112
v_swperrcount 1536
vadr_control 4032
vem_user_actlog 1536
vem_user_actlog1 1536
vhm_run 4416
vinc_meter_info 3840
POOL NAME BYTES
-------------- -------------------------- ----------
shared pool vincident 7104
vincident_file 2496
vips_file_copy_log 3648
vips_file_metadata 2112
vips_package_file 2880
vips_package_history 3072
vips_package_incident_det 10560
vips_package_main_int 1536
vips_package_main_problem 1728
vips_package_size 1536
vips_pkg_file 3456
POOL NAME BYTES
-------------- -------------------------- ----------
shared pool vips_pkg_incident_candida 7104
vnot_exist_incident 6912
vpdb_problem 3648
vproblem 5952
vproblem1 5568
vproblem2 5760
vproblem_bucket 2112
vproblem_bucket1 2112
vproblem_bucket_count 2304
vproblem_int 5376
vproblem_lastinc 5184
POOL NAME BYTES
-------------- -------------------------- ----------
shared pool vshowcatview 1920
vshowincb 1920
vshowincb_i 1920
vtest_exists 2496
work area table entry 265856
write info array 65536
write state object 14263584
writes stopped lock conte 32
writes stopped lock state 24
x$ksmfs table 160
x$rule_set 39208
POOL NAME BYTES
-------------- -------------------------- ----------
shared pool xscalc 4144
xslongops 16400
xssinfo 9360
zafwctx 182704
zasasga 16
zlllab Group Tree Heap De 160
************** ----------
sum 1342177280
buffer_cache 6962544640
fixed_sga 8945744
POOL NAME BYTES
-------------- -------------------------- ----------
log_buffer 7827456
shared_io_pool 134217728
************** ----------
sum 7113535568
1456 rows selected.
SQL>
Oracle数据库的共享内存区域(System Global Area,SGA)内部被划分为不同的内存池,
每个内存池用于存储不同类型的数据和信息。
这种划分有助于有效地管理数据库内存资源和提高性能。
在Oracle数据库的SGA(System Global Area)中,以下几个池是主要的,
因为它们在数据库性能和内存管理方面起着关键作用:
1. Buffer Cache(缓冲池):缓冲池是SGA中最重要的池之一。它用于缓存磁盘上的数据块,以减少磁盘IO操作的频率。数据库中的数据块(通常大小为8KB)在查询和修改时被加载到缓冲池中,如果相同的数据块被后续查询请求使用,就可以从内存中读取,而不是从磁盘。这大大提高了查询性能。
2.Shared Pool(共享池):共享池用于存储SQL语句的解析信息、共享的SQL区域和PL/SQL块。这有助于减少SQL语句的解析次数,提高性能。共享池还包括诸如数据字典缓存等重要信息。
3. Redo Log Buffer(重做日志缓冲区):重做日志缓冲区用于存储正在进行的事务的重做日志记录,以确保事务的持久性。重做日志是数据库恢复的关键部分,因此它的性能至关重要。
这些主要池在Oracle数据库的正常运行中扮演着至关重要的角色,
它们直接影响着数据库的性能和可用性。
DBAs(数据库管理员)通常会根据数据库的工作负载和性能需求来配置和调整这些池的大小,
以确保数据库能够有效地使用内存资源并满足性能要求。
其他池还包括:
- Java 池(Java pool):Java池是为数据库中运行的Java虚拟机(JVM)所分配的一段固定大小的内存。在Oracle Database 10g及更高版本中,Java池可以在数据库启动和运行时动态调整大小。
- 大池(large pool):在使用共享服务器连接时存放会话内存(UGA)、在使用并行执行功能时做为消息缓冲区、在RMAN备份时做为磁盘I/O缓冲区。大池可以动态调整大小。
- 流池(streams pool):这是一个专门针对数据传输/共享工具(例如Oracle GoldenGate 和OracleStreams)的内存池。它是Oracle Database 10g中新增的,可以动态调整大小。如果未配置流池,但是使用了流功能,Oracle会使用共享池中最多10%的空间作为流内存。
- “空”池(“Null”pool):这个池其实没有名字。它是块缓冲区(用来缓存数据库块)、重做日志缓冲区和“固定SGA”区专用的内存。
其他池(如Large Pool和Java Pool等)也可以根据具体的需求进行配置和管理,
但它们通常不像上述三个主要池那样频繁地调整。