文章目錄
- 二 記憶體管理方式
- 三 SGA的分配
- 四 操作樣本
- 五 總結
一 什麼是SGA(參考 Oracle記憶體結構--SGA)
SGA是一組為系統分配的共用的記憶體結構,可以包含一個資料庫執行個體的資料或控制資訊。如果多個使用者串連到同一個資料庫執行個體,在執行個體的SGA中,資料可以被多個使用者共用。當資料庫執行個體啟動時,SGA的記憶體被自動分配;當資料庫執行個體關閉時,SGA記憶體被回收。 SGA是佔用記憶體最大的一個地區,同時也是影響資料庫效能的重要因素。
SGA區是可讀寫的。所有登入到執行個體的使用者都能讀取SGA中的資訊,而在oracle做執行操作時,服務進程會將修改的資訊寫入SGA區。
SGA主要包括了以下的資料結構:
資料緩衝(Buffer Cache)
重做日誌緩衝(Redo Log Buffer)
共用池(Shared Pool)
Java池(Java Pool)
大池(Large Pool)
流池(Streams Pool --- 10g以後才有)
資料字典緩衝(Data Dictionary Cache)
其他資訊(如資料庫和執行個體的狀態資訊)
The SGA is the Oracle structure that is located in shared memory. It contains static data structures, locks, and data buffers. Sufficient shared memory must be available to each Oracle process to address the entire SGA.
The maximum size of a single shared memory segment is specified by the shmmax kernel parameter.
The following table shows the recommended value for this parameter, depending on the platform:
If the size of the SGA exceeds the maximum size of a shared memory segment (shmmax or shm_max), then Oracle Database attempts to attach more contiguous segments to fulfill the requested SGA size. The shmseg kernel parameter specifies the maximum number of segments that can be attached by any process. Set the following initialization parameters to control the size of the SGA:
DB_CACHE_SIZE
DB_BLOCK_SIZE
JAVA_POOL_SIZE
LARGE_POOL_SIZE
LOG_BUFFERS
SHARED_POOL_SIZE
Alternatively, set the SGA_TARGET initialization parameter to enable automatic tuning of the SGA size.
Use caution when setting values for these parameters. When values are set too high, too much of the physical memory is devoted to shared memory. This results in poor performance.
An Oracle Database configured with Shared Server requires a higher setting for the SHARED_POOL_SIZE initialization parameter, or a custom configuration that uses the LARGE_POOL_SIZE initialization parameter. If you installed the database with Oracle Universal Installer, then the value of the SHARED_POOL_SIZE parameter is set automatically by Oracle Database Configuration Assistant. However, if you created a database manually, then increase the value of the SHARED_POOL_SIZE parameter in the parameter file by 1 KB for each concurrent user.
二 記憶體管理方式
Oracle 8i:手動 PGA管理
Oracle 9i:自動PGA記憶體管理、手工共用記憶體管理
Oracle 10g:自動共用記憶體管理
Oracle 11g:自動記憶體管理
三 SGA的分配
SGA的管理又三種方式
8i:SGA的總大小由所有記憶體組件大小之和決定,不能直接定義SGA大小。對內部組件大小的修改必須在資料庫重啟後才會生效,所以叫SGA的靜態管理。
9i:SGA總大小由初始化參數SGA_MAX_SIZE確定,各個記憶體最賤大小之和不能超過這個參數,在這個大小之下,SGA各個記憶體組件可以在不重啟資料庫的情況下直接修改大小,所以叫做SGA的動態管理。
10g:SGA大小既可以像9i一樣動態管理,也可以實施SGA的自動管理,只需要設定初始化參數SGA_TARGET,SGA各個記憶體組件就可以由資料庫自動化佈建大小,設定的資料來源於系統自動收集的統計資訊。在9i以後,SGA的內部組件大小可以動態調整,也可以由資料庫自動管理,在設定記憶體大小的時候,分配的基本單位是粒度(granule).Granule是一段連續的虛擬記憶體,大小取決於SGA_MAX_SIZE的大小,如果SGA_MAX_SIZE小於128M,Granule為4M,否則Granule為16M。各個記憶體組件分配大小必須是Granule的整倍數。整個SGA最小不小於3個Granule大小。
9i中的規則如下
Linux/Unix
SGA <= 128M granule 4M
SGA > 128M granule 16M
Windows
SGA <= 128M granule 4M
SGA > 128M granule 8M
10G中的分配規則為
Linux/Unix/Windows
SGA <= 1G granule為4M,否則為16M
SGA的各個組件大小是可以動態調整的,總大小不超過參數SGA_MAX_SIZE或者SGA_TARGET的大小。
四 操作樣本
SQL> SELECT name, bytes/1024/1024 MB, resizeable from v$sgainfo;NAME MB RES-------------------------------- ---------- ---Granule Size 4 No-------------------------------- ---------- ---SQL> show parameter sga_max_size;NAME TYPE VALUE------------------------------------ ----------- ------------------------------sga_max_size big integer 160MSQL> ALTER SYSTEM SET sga_max_size=1025m scope=spfile;System altered.SQL> startup force;ORACLE instance started.Total System Global Area 1090519040 bytesFixed Size 1218944 bytesVariable Size 1056966272 bytesDatabase Buffers 16777216 bytesRedo Buffers 15556608 bytesDatabase mounted.Database opened.SQL> show parameter sga_max_size;NAME TYPE VALUE------------------------------------ ----------- ------------------------------sga_max_size big integer 1040M--因各個記憶體組件分配大小必須是Granule的整倍數,右1025隔1040最近,所以此處為1040M。SQL> SELECT name, bytes/1024/1024 MB, resizeable from v$sgainfo;NAME MB RES-------------------------------- ---------- ---Granule Size 16 No-------------------------------- ---------- ---SQL> desc v$sgainfo; Name Null? Type ----------------------------------------- -------- ---------------------------- NAME VARCHAR2(32) BYTES NUMBER RESIZEABLE VARCHAR2(3)SQL> select * from v$sgainfo;NAME BYTES RES-------------------------------- ---------- ---Fixed SGA Size 1218316 NoRedo Buffers 2973696 NoBuffer Cache Size 92274688 YesShared Pool Size 62914560 YesLarge Pool Size 4194304 YesJava Pool Size 4194304 YesStreams Pool Size 0 YesGranule Size 4194304 NoMaximum SGA Size 167772160 NoStartup overhead in Shared Pool 37748736 NoFree SGA Memory Available 011 rows selected.SQL> SELECT name, bytes/1024/1024 MB, resizeable from v$sgainfo;NAME MB RES-------------------------------- ---------- ---Fixed SGA Size 1.16187668 NoRedo Buffers 2.8359375 NoBuffer Cache Size 88 YesShared Pool Size 60 YesLarge Pool Size 4 YesJava Pool Size 4 YesStreams Pool Size 0 YesGranule Size 4 NoMaximum SGA Size160 NoStartup overhead in Shared Pool 36 NoFree SGA Memory Available 011 rows selected.SQL> show parameter sga_max_size;NAME TYPE VALUE------------------------------------ ----------- ------------------------------sga_max_size big integer 160MSQL> ALTER SYSTEM SET sga_max_size=1025m scope=spfile;System altered.SQL> startup force;ORACLE instance started.Total System Global Area 1090519040 bytesFixed Size 1218944 bytesVariable Size 1056966272 bytesDatabase Buffers 16777216 bytesRedo Buffers 15556608 bytesDatabase mounted.Database opened.SQL> show parameter sga_max_size;NAME TYPE VALUE------------------------------------ ----------- ------------------------------sga_max_size big integer 1040MSQL> SELECT name, bytes/1024/1024 MB, resizeable from v$sgainfo;NAME MB RES-------------------------------- ---------- ---Fixed SGA Size 1.16247559 NoRedo Buffers 14.8359375 NoBuffer Cache Size 16 YesShared Pool Size 96 YesLarge Pool Size 16 YesJava Pool Size 16 YesStreams Pool Size 0 YesGranule Size 16 NoMaximum SGA Size 1040 NoStartup overhead in Shared Pool 32 NoFree SGA Memory Available88011 rows selected.SQL> show parameter shared_p;NAME TYPE VALUE------------------------------------ ----------- ------------------------------shared_pool_reserved_size big integer 4Mshared_pool_size big integer 0SQL> ALTER SYSTEM SET shared_pool_size=10m;System altered.SQL> ALTER SYSTEM SET sga_max_size=800m scope=spfile; System altered.SQL> startup force;ORACLE instance started.Total System Global Area 838860800 bytesFixed Size 1222192 bytesVariable Size 734005712 bytesDatabase Buffers 100663296 bytesRedo Buffers 2969600 bytesDatabase mounted.Database opened.SQL> ALTER SYSTEM set shared_pool_size=10m;System altered.SQL> show parameter shared_p;NAME TYPE VALUE------------------------------------ ----------- ------------------------------shared_pool_reserved_size big integer 838860shared_pool_size big integer 12MSQL> show parameter sga_max_size;NAME TYPE VALUE------------------------------------ ----------- ------------------------------sga_max_size big integer 800MSQL> show parameter sga_target;NAME TYPE VALUE------------------------------------ ----------- ------------------------------sga_target big integer 160MSQL> show parameter shared_pool_size;NAME TYPE VALUE------------------------------------ ----------- ------------------------------shared_pool_size big integer 12MSQL> show parameter large_pool_size;NAME TYPE VALUE------------------------------------ ----------- ------------------------------large_pool_size big integer 0SQL> show parameter java_pool_size;NAME TYPE VALUE------------------------------------ ----------- ------------------------------java_pool_size big integer 0SQL> show parameter streams_pool_size; NAME TYPE VALUE------------------------------------ ----------- ------------------------------streams_pool_size big integer 0SQL> show parameter db_cache_size;NAME TYPE VALUE------------------------------------ ----------- ------------------------------db_cache_size big integer 0SQL> show parameter sga_target;NAME TYPE VALUE------------------------------------ ----------- ------------------------------sga_target big integer 160MSQL>
五 總結
1. SGA是一組為系統分配的共用的記憶體結構,可以包含一個資料庫執行個體的資料或控制資訊。
2. SGA主要包括了以下的資料結構:資料緩衝(Buffer Cache)、重做日誌緩衝(Redo Log Buffer)、共用池(Shared Pool)、Java池(Java Pool)、大池(Large Pool)、流池(Streams Pool --- 10g以後才有)、資料字典緩衝(Data Dictionary Cache)、其他資訊(如資料庫和執行個體的狀態資訊);
3.可以通過v$sgainfo視圖查看sga相關資訊。
我的郵箱:wgbno27@163.com 新浪微博:@Wentasy27 公眾平台:JustOracle(號:justoracle) IT交流群:336882565(加群時驗證 From CSDN XXX) Oracle交流討論群組:https://groups.google.com/d/forum/justoracle By Larry Wen
|
|
@Wentasy 博文僅供參考,歡迎大家來訪。如有錯誤之處,希望批評指正。原創博文如需轉載請註明出處,謝謝 [CSDN部落格] |