# Oracle/Geheugengebieden
## Geheugengebieden

De System Global Area (SGA) of soms ook Shared Global Area van een Oracle database is het geheugengebied op de server dat gebruikt wordt door de verschillende Oracle processen. De SGA is onder te verdelen in verschillende gebieden. De belangrijkste gebieden zijn de buffer cache, shared pool, large pool, redo buffer en de java pool. Deze processen lezen en/of schrijven in deze geheugengebieden van de SGA. Een serverproces leest bijvoorbeeld de rijen uit een tabel uit de buffer cache en stuurt dit door naar de client. Een achtergrondproces zoals de database writer (DBWR) schrijft blokken uit de buffercache weg naar de datafiles. Naast deze verschillende variabele gebieden waarin data wordt opgeslagen, is er ook een vast gebied waar sturingsinformatie in wordt opgeslagen voor de processen. Hierin wordt bijvoorbeeld ook de status van de database en instance in weggeschreven. De verschillende processen kunnen hier ook de locking informatie uitlezen. Dit gedeelte van de SGA wordt de fixed SGA genoemd.
Tijdens het starten van de Oracle database wordt de SGA gealloceerd en dit gehele geheugengebied wordt weer vrijgegeven bij het stoppen van de Oracle database.
De totale omvang van de SGA wordt bepaalt door een aantal instance parameters. De omvang van de verschillende deelgebieden kunnen apart worden aangegeven of vanaf Oracle9i kan men automatisch de verschillende deelgebieden laten groeien of krimpen.

#### Buffer Cache

De Buffer Cache wordt ook wel Database Buffer Cache genoemd. Het is een deel van het SGA waarin het meest recente, of in ieder geval vaak opgevraagde stukje data in het geheugen wordt opgeslagen. Dit is vooral handig om de I/O te verminderen, omdat er nu minder vaak van de harddisk gelezen hoeft te worden. Het gaat om statische data, zodat de I/O tussen de buffercache en harddisk beperkt blijft.

#### Shared Pool

De Shared Pool bestaat uit:
* Library cache
** Shared SQL
** PL/SQL area.
* Data dictionary cache.
Library cache: zoals je ziet bestaat de Library Cache uit 2 compononenten. Hierin worden alle SQL en PL/SQL statements gecached, nadat deze zijn geparsed en gevalideerd. De Library cache valideert ook of je voldoende privileges hebt om de statement uit te voeren.
Data dictionary cache: hierin worden objecten van de Data Dictionary in opgeslagen aan de hand van het LRU (Least Recently Used) algoritme. De Data dictionary wordt door Oracle constant gebruikt voor de validatie van gebruikers, en status van objecten.

#### Large Pool

De Large Pool is een optioneel stukje geheugen uit het SGA. O.a. RMAN gebruikt de Large Pool voor Oracle Backup en Restore akties. Alhoewel RMAN ook zonder kan is het raadzaam om wel een Large Pool te definieren om zo de druk op de Shared Pool te verminderen.

#### Java Pool

De Java Pool wordt eigenlijk alleen gebruikt als je java stored procedures gebruikt. In de init.ora kun je aangegeven met JAVA_POOL_SIZE parameter hoe groot je de java pool size wilt hebben.

### Program Global Areas

Zoals je kunt zien in bovenstaande tekening heeft elk proces een eigen prive geheugengebied, dit wordt de Program Global Area (PGA) genoemd. Deze geheugengebieden vallen dus ook buiten de SGA en heeft elk proces, of het nu een achtergrondproces is zoals DBWR of een serverproces ten behoeve van een client connectie. De processen kunnen dan ook niet lezen of schrijven in de PGA van een ander proces.
De totale omvang van alle PGA gebieden bijelkaar wordt de aggregated PGA genoemd. Vanaf Oracle9i kan er een limiet gezet worden op de totale, aggregated, omvang van de PGA. Voor Oracle8i was de omvang van de PGA, met name de SQL Work Area, alleen te sturen met enkele instance parameters, zoals sort_area_size en hash_area_size.

#### Private SQL Area

Een SQL opdracht dat door een client wordt gestart heeft in de PGA van het serverproces een Private SQL area. Hierin worden bijvoorbeeld de waarden van bindvariabelen in opgeslagen. Dus naast een Shared SQL area waarin alle SQL statements staan, is er ook een Private SQL Area.
De data in de persistent area van de Private SQL area wordt pas vrijgegeven als een cursor, SQL opdracht, wordt gesloten.
De Private SQL Area valt niet in alle gevallen in de PGA van het serverproces, als voor een instance de zogenaamde Shared Server mode actief is, dan wordt de Private SQL Area opgeslagen in de SGA. Om precies te zijn in de large pool van de SGA.

#### SQL Work Area

Als voor een bepaalde SQL opdracht een sortering uitgevoerd moet worden dan zal eerst een poging gedaan worden om deze sortering in het geheugen uit te voeren. Dit gebeurt in de SQL Work Area van de PGA. Ook het uitvoeren van hash joins gebeurt in eerste instantie in de SQL Work Area. Mocht blijken dat deze operaties niet in het geheugen uitgevoerd kunnen worden dan zal de operatie verder worden uitgevoerd op disk, in de Temporary Tablespace.
De Oracle Database is een multi-user, multi-process RDBMS. Dit betekent dat verschillende gebruikers en processen gelijktijdig bepaalde operaties uitvoeren binnen de SGA of in het geval van de achtergrond processen data lezen of weggeschreven naar disk.