學習學習再學習&&思考思考再思考java
實踐實踐再實踐@@覆盤覆盤再覆盤數據庫
每一個oracle數據庫實例都有一個很大的內存結構,稱爲系統全局區(System Global Area),這是一個大型的共享內存結構,每一個oracle進程都會訪問它。在Linux/Unix操做系統上,SGA是一個物理實體,使用操做系統命令能「看到它」。緩存
01oracle
它被物理地劃分爲一個共享內存段,進程能夠附加到這段獨立的內存上。你能夠把SGA想象成小汽車的前置箱,在這個前置箱裏面會有發動機進程,軸轉動進程等。SGA也是能夠脫離Oracle進程而存在的,正如即便發動機,轉軸不裝載到前置箱裏面,前置箱也能夠獨立存在。可是,在生產環境中,若是真的只有SGA而沒有任何Oralce進程,那說明數據庫以某種方式奔潰了,這種狀況相似小汽車已經靜止不能動態運轉了。咱們能夠經過ipcs -m|grep ora查看SGA:app
在數據庫內部,不管在什麼操做系統平臺(能夠類比爲馬路),能夠經過動態性能視圖v$sgastat來查看:ide
02性能
在一份oracle骨骼剖解,請查收中咱們說過SGA包括share_pool,db_buffer,cache_buffer,java_pool,large_pool,stream_pool六大組件,前三個爲核心組件,後三個爲非核心組件。對SGA總體大小影響最大的參數是如下這些。學習
java_pool_size:控制java池的大小。優化
shared_pool_size:在某種程度上控制共享池的大小。spa
large_pool_size:控制大池的大小。
streams_pool_size:控制流池的大小。
db_*_cache_size:共有8個cache_size參數,控制各個可用的緩衝區緩存的大小。
log_bufer:在某種程度上控制重作日誌緩衝區的大小。
sga_target:在oracle DB 10g及更高版本中用於自動SGA內存管理,可動態調整。
sga_max_size:用於控制SGA的大小。
memory_target:在oracle DB 11g及更高版本中用於自動內存管理。
memory_max_size:在oracle DB 11g及更高版本中對於採用自動內存管理的數據庫,使其PGA和SGA的內存總用量儘量達到(而且不超出)memory_max_size的值。這些參數的設置和優化就涉及到了oracle的SGA的管理和優化。
03
須要注意的是,不管是使用手動內存管理仍是自動內存管理,都會發現各個池的內存是基於一種被稱爲顆粒granule的單位來分配的。一個顆粒大小爲4MB,8MB,16MB的內存區。好比你想要一個5MB的java池,而你的顆粒大小爲4MB,oracle實際上會爲這個java池分配8MB。經過查詢V$SGA_DYNAMIC_COMPONENTS,能夠查看各個池中的顆粒大小。
SQL> show parameter sga_target;
NAME TYPE VALUE
sga_target big integer 1020M
SQL> select component, granule_size from v$sga_dynamic_components;
COMPONENT GRANULE_SIZE
---------------------------------------------------------------- ------------
shared pool 4194304
large pool 4194304
java pool 4194304
streams pool 4194304
DEFAULT buffer cache 4194304
KEEP buffer cache 4194304
RECYCLE buffer cache 4194304
DEFAULT 2K buffer cache 4194304
DEFAULT 4K buffer cache 4194304
DEFAULT 8K buffer cache 4194304
DEFAULT 16K buffer cache 4194304
COMPONENT GRANULE_SIZE
---------------------------------------------------------------- ------------
DEFAULT 32K buffer cache 4194304
ASM Buffer Cache 4194304
13 rows selected.
sga大小決定了顆粒的大小。能夠經過調整sga_tartet的大小來實驗一把:
SQL> alter system set sga_target=1035m scope=spfile;
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 1090519040 bytes
Fixed Size 2083304 bytes
Variable Size 301991448 bytes
Database Buffers 771751936 bytes
Redo Buffers 14692352 bytes
Database mounted.
Database opened.
再次查看sga_target大小:
SQL> show parameter sga_target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_target big integer 1040M
如今再來看看sga各組件顆粒度:
能夠看到,SGA爲1.01G時,會以16MB的顆粒爲池分配空間,因此池大小都將是16MB的某個倍數。這充分證實了SGA的大小決定了顆粒的大小。