Gilt für:
Oracle Datenbank – 12.1.0.2
Autor:
Mahesh Reddy M
Einführung:
Mit der Einführung von Oracle Database 12c In-Memory kann eine einzelne Datenbank jetzt gemischte Workloads effizient unterstützen und eine optimale Leistung für Transaktionen bei gleichzeitiger Unterstützung von Echtzeitanalysen und -berichten liefern. In-Memory ermöglicht es sowohl Data Marts als auch Data Warehouses, mehr Ad-hoc-Analysen bereitzustellen, sodass Endbenutzer in der Lage sind, mehrere geschäftsrelevante Abfragen in derselben Zeit zu stellen, in der derzeit nur eine ausgeführt wird. Mit dieser Funktion können Sie Spalten, Tabellen, Partitionen und materialisierte Ansichten im Speicher im Spaltenformat und nicht im typischen Zeilenformat speichern. Der In-Memory-Spaltenspeicher (IM-Spaltenspeicher) war die bedeutendste Funktion des Patch-Sets 12.1.0.2.
Architektur von Oracle Database 12c In-Memory:
Üblicherweise werden Daten nur im Zeilenformat gespeichert, während In-Memory-Daten nur im Spaltenformat gespeichert werden. Oracle Database 12c unterstützt also eine Architektur mit zwei Formaten.
- Wenn Daten für Lese-/Schreibvorgänge (Datenmanipulationen) angefordert werden, werden sie in den traditionellen Zeilenspeicher (Puffercache) geladen.
- Wenn Daten für schreibgeschützte Vorgänge angefordert werden, werden sie in einen neuen In-Memory-Spaltenspeicher eingetragen. Diese Bestückung umfasst natürlich eine Transformation vom Zeilen- in das Spaltenformat.
- Immer wenn der Commit für eine Transaktion erfolgt, die Einfügungen, Aktualisierungen oder Löschvorgänge enthält, werden die neuen Daten sofort und gleichzeitig sowohl im Zeilenspeicher als auch im In-Memory-Spaltenspeicher angezeigt. Daher sind beide Speicher transaktionskonsistent.
In-Memory-Spaltenspeicher:
Die In-Memory-Datenbank verwendet einen In-Memory-Spaltenspeicher, der eine neue Komponente des System Global Area (SGA) ist und als In-Memory-Bereich bezeichnet wird. Daten im IM-Spaltenspeicher haben nicht das herkömmliche Zeilenformat, sondern verwenden ein neues Spaltenformat. Der IM-Spaltenspeicher ersetzt nicht den Puffercache, sondern dient als Ergänzung, sodass Daten jetzt sowohl im Zeilen- als auch im Spaltenformat gespeichert werden können.
Der In-Memory-Bereich ist ein statischer Pool innerhalb des SGA, dessen Größe durch den Initialisierungsparameter INMEMORY_SIZE (default 0) gesteuert wird. Die aktuelle Größe des In-Memory-Bereichs ist in V$SGA sichtbar.
Der IM-Spaltenspeicher ist in zwei Pools unterteilt:
- 1-MB-Pool – Speichern der tatsächlichen spaltenformatierten Daten
- 64-k-Pool – Speichern der Metadaten zu den Objekten
Mit der folgenden Abfrage können wir den verfügbaren Arbeitsspeicher in jedem Pool anzeigen:
SQL> select * from v$inmemory_area;
POOL |
ALLOC_BYTES |
USED_BYTES |
POPULATE_STATUS |
CON_I |
1MB POOL |
2.5767E+11 |
2.3569E+11 |
DONE |
1 |
64KB POOL |
6.4408E+10 |
876347392 |
DONE |
1 |
1MB POOL |
2.5767E+11 |
2.3569E+11 |
DONE |
2 |
64KB POOL |
6.4408E+10 |
876347392 |
DONE |
2 |
1MB POOL |
2.5767E+11 |
2.3569E+11 |
DONE |
3 |
64KB POOL |
6.4408E+10 |
876347392 |
DONE |
3 |
Tabelle 1: Verfügbarer Speicher in jedem Pool
IM-Spaltenspeicher aktivieren:
Als statischer Pool werden Änderungen am Parameter INMEMORY_SIZE erst nach einem Neustart der Datenbankinstanz wirksam. Er wird auch nicht von der automatischen Speicherverwaltung (Automatic Memory Management, AMM) beeinflusst oder gesteuert. Der In-Memory-Bereich muss mindestens 100 MB groß sein.
sql> ALTER SYSTEM SET SGA_TARGET=500G SCOPE=SPFILE;
sql> ALTER SYSTEM SET INMEMORY_SIZE=300G SCOPE=SPFILE;
sql>SHUTDOWN IMMEDIATE;
sql>STARTUP;
ORACLE instance started.
Total System Global Area 4.2950E+11 bytes
Fixed Size 7677400 bytes
Variable Size 2.0938E+10 bytes
Database Buffers 8.5899E+10 bytes
Redo Buffers 529190912 bytes
In-Memory Area 3.2212E+11 bytes
Database mounted.
Database opened.
Wir können die In-Memory-Einstellungen mit der folgenden Abfrage einsehen:
SQL> SHOW PARAMETER INMEMORY
NAME TYPE VALUE
---------------------------------- ----------- -----
inmemory_clause_default string
inmemory_force string DEFAULT
inmemory_max_populate_servers integer 1
inmemory_query string ENABLE
inmemory_size biginteger 300G
inmemory_trickle_repopulate_servers_ integer 1
percent
optimizer_inmemory_aware boolean TRUE
Wir können den Parameter inmemory_size auch auf CDB- und PDB-Ebene festlegen. Wenn Sie diesen Parameter auf PDB-Ebene festlegen, müssen Instanz oder PDB nicht neu gestartet werden. Die Summe aller PDB-Werte ist kleiner als der CDB-Wert.
Wir können die In-Memory-Option auf der unten gezeigten PDB-Ebene aktivieren und deaktivieren.
Stellen Sie eine Verbindung zum PDB her und führen Sie den folgenden Befehl aus:
Deaktivieren:
Alter system set inmemory_size=0; or
Alter system reset inmemory_size;
Aktivieren:
Alter system set inmemory_size=20G;
In-Memory-Prioritätsstufen:
Der IM-Spaltenspeicher sollte mit den leistungskritischsten Daten in der Datenbank bestückt werden. Weniger leistungskritische Daten können sich auf kostengünstigeren Flashspeichern oder Datenträgern befinden. Wenn Ihre Datenbank klein genug ist, können Sie natürlich alle Ihre Tabellen in den IM-Spaltenspeicher einfügen. Database In-Memory fügt ein neues INMEMORY-Attribut für Tabellen und materialisierte Ansichten hinzu.
Wir können das Attribut INMEMORY aktivieren unter
Tablespace, Tabelle, (Unter-)Partition und materialisierte Ansicht.
Wenn Sie dieses Attribut auf Tablespace-Ebene aktivieren, werden standardmäßig alle Tabellen und materialisierten Ansichten im Tablespace für den IMCOLUMN-Speicher aktiviert.
alter tablespace quest INMEMORY;
Wenn Sie dieses Attribut auf Tabellenebene aktivieren, bedeutet dies, dass alle Tabellenspalten in den IMCOLUMN-Speicher eingefügt werden sollen. Es ist jedoch möglich, nur einen Teil der Spalten in den IMCOLUMN-Speicher einzufügen.
Alter table quest_tab INMEMORY NO Inmemory (EMP);
Funktioniert ähnlich für partitionierte Tabellen
Alter table quest_tab INMEMORY MODIFY Partition quest_part_1 No Inmemory;
Hintergrundprozesse:
IMCO: Der IMCO-Hintergrundprozess initiiert die Bestückung (Vorauffüllung) von speicherinternen Objekten mit der Priorität LOW/MEDIUM/HIGH/CRITICAL.
SMCO: SMCO erzeugt dynamisch Slave-Prozesse (Wnnn), um diese Aufgaben zu implementieren.
Wnnn: Wnnn-Prozesse führen speicherinterne Aufgaben zum Bestücken oder Wiederauffüllen speicherinterner aktivierter Objekte aus.
Objekte werden entweder direkt nach dem Öffnen der Datenbank oder nach dem ersten Scannen (Abfragen) in einer priorisierten Liste in den IM-Spaltenspeicher eingefügt. Die Reihenfolge, in der Objekte bestückt werden, wird durch das Schlüsselwort PRIORITY gesteuert, das fünf Ebenen hat. Die Standard-PRIORITY ist NONE. Dies bedeutet, dass ein Objekt erst nach dem ersten Scannen bestückt wird.
Verschiedene Prioritätsstufen, die von der Unterklausel PRIORITY der Klausel INMEMORY gesteuert werden.
Prioritätsstufe Beschreibung
CRITICAL Objekt wird sofort nach dem Öffnen der Datenbank bestückt
HIGH Objekt wird bestückt, nachdem alle CRITICAL-Objekte bestückt wurden
MEDIUM Objekt wird bestückt, nachdem alle CRITICAL- und HIGH-Objekte bestückt wurden
LOW Objekt wird bestückt, nachdem alle CRITICAL-, HIGH- und MEDIUM-Objekte bestückt wurden
NONE Objekte werden erst bestückt, nachdem sie zum ersten Mal gescannt wurden (Standard)
Objekte, die kleiner als 64 KB sind, werden nicht in den Arbeitsspeicher aufgenommen, da sie eine erhebliche Menge an Speicherplatz im IM-Spaltenspeicher verschwenden, da der Arbeitsspeicher in 1-MB-Blöcken zugewiesen wird.
Beispiel: alter table quest inmemory priority critical;
In-Memory-Komprimierungstechniken:
Der IM-Spaltenspeicher verwendet spezielle Komprimierungsformate, die für die Zugriffsgeschwindigkeit optimiert sind, anstatt die Speicherkapazität zu reduzieren. Die Datenbank erhöht die Geschwindigkeit auf folgende Weise:
- Durch die Komprimierungsformate kann die Datenbank die für jede Spalte verarbeitete Speichermenge verringern. SQL wird direkt in den komprimierten Spalten ausgeführt.
- Die Datenbank verwendet SIMD-Vektor-(Array)-Anweisungen, um ein Array von Spaltenwerten in einem einzelnen CPU-Taktzyklus zu verarbeiten. In der Datenbank können viele Werte in einem Vektor gespeichert werden, wodurch die Leistungsvorteile der SIMD-Vektorverarbeitung maximiert werden.
Die in-Memory-Komprimierung wird mit dem Schlüsselwort MEMCOMPRESS, einer Unterklausel des Attributs INMEMORY, angegeben. Es gibt sechs Stufen, von denen jede eine unterschiedliche Komprimierung und Leistung bietet.
No Memcompress: Daten werden ohne Komprimierung in In-Memory übertragen.
Memcompress for DML: Hauptsächlich für DML-Leistung und minimale Komprimierung.
Memcompress for Query Low: Optimiert für die Abfrageleistung (Standard).
Memcompress for Query High: Optimiert für die Abfrageleistung und spart außerdem Speicherplatz.
Memcompress for Capacity Low: Platzsparender im Vergleich zu Query High und Low.
Memcompress for Capacity High: Optimiert für Platzersparnis und etwas weniger Leistung.
Die Komprimierungsraten können je nach gewählter Komprimierungsoption, Datentyp und Inhalt der Tabelle zwischen 2X und 20X variieren.
Beispiel: alter table quest inmemory memcompress for query high;
In-Memory-Spaltenspeicher auf RAC:
In der Cluster-Umgebung verfügt jeder Knoten über einen eigenen Spaltenspeicher. Jeder Knoten im Cluster sollte die gleiche Größe wie der IM-Spaltenspeicher haben. Standardmäßig werden alle im Arbeitsspeicher vorhandenen Objekte auf alle IM-Spaltenspeicher im Cluster verteilt. Die Verteilung der Objekte auf die IM-Spaltenspeicher in einem Cluster wird durch zwei zusätzliche Unterabschnitte des INMEMORY-Attributs gesteuert: DISTRIBUTE und DUPLICATE (nur für entwickelte Systeme).
Distribute:
Die Verteilung der Objekte im Cluster wird durch die Unterklausel „distribute“ gesteuert. Sie können die Objekte folgendermaßen verteilen:
Verteilen nach Zeilenreihen: Verteilen Sie die Objekte nach Zeilen auf verschiedene Knoten
Verteilen nach Partition: Verteilen der Partitionen auf Knoten im Cluster
Verteilen nach Unterpartition: Verteilen der Unterpartition auf verschiedene Knoten.
Beispiel: alter table quest inmemory distribute by partition;
Hier ist es wichtig, zu sagen, dass Oracle In-Memory RAC eine
Shared-Nothing-Architektur für Abfragen ist. Wenn Sie also erneut eine Abfrage nach In-Memory-Datenobjekten auslösen (vorausgesetzt, die Objekte sind in zwei IM-Spaltenspeichern verteilt), können Sie nur auf die Daten zugreifen, die sich im Affinitätsknoten befinden, nutzen Sie also IMCUs (In-Memory-Komprimierungseinheiten) nicht gemeinsam auf mehreren Instanzen im Cluster.
So können Sie
den Grad der Parallelität (DOP) auf AUTO einstellen. Der Koordinator für parallele Abfragen identifiziert die anderen Instanzen des IMCU-Standorts. Wenn Sie den DOP nicht auf AUTO setzen können, verwendet der Koordinator für parallele Abfragen die anderen Instanzen der IMCU nicht.
Legen Sie den Grad der Parallelität auf „auto“ fest.
alter system set parallel_degree_policy=AUTO scope=both sid='*';
Duplicate:
Um die Verfügbarkeit zu erhöhen, werden Objekte in alle Instanzen kopiert. Sie können die Unterklausel „duplicate“ verwenden, um anzugeben, dass die In-Memory-Tabelle in allen Instanzen im Cluster gespeichert wird. Für nicht entwickelte Systeme funktioniert diese Option nicht.
Beispiel: alter table quest inmemory duplicate all;
Die Tabelle „quest“ wird in allen Instanzen gespeichert.
In-Memory-Objekte überwachen:
Für die Überwachung von In-Memory-Objekten bietet Oracle zwei neue V$views an:
v$IM_SEGMENTS oder v$IM_USER_SEGMENTS und v$IM_COLUMN_LEVEL.
Mit diesen Ansichten können wir herausfinden, wie viele Objekte derzeit im Speicher IMCOLUMN vorhanden sind.
EX:
set linesize 256
set pagesize 999
select segment_name,ROUND(SUM(BYTES)/1024/1024/1024,2) "DATA GB",
ROUND(SUM(INMEMORY_SIZE)/1024/1024/1024,2) "IN-MEM GB",
ROUND(SUM(BYTES-BYTES_NOT_POPULATED)*100/SUM(BYTES),2) "% IN_MEM",
ROUND(SUM(BYTES-BYTES_NOT_POPULATED)/SUM(INMEMORY_SIZE),2) "COMP RATIO"
from V$IM_SEGMENTS
group by owner,segment_name
order by SUM(bytes) desc;
SEGMENT_NAME ORIG GB IN-MEM GB % IN_MEM COMP RATIO
H_LINEITEM 317.27 68.2 88.77 4.13
H_PARTSUPP 35.17 21.04 100 1.67
EX:
set linesize 256
set pagesize 999
set verify off
col OBJECT format a30
SELECT owner||'.'||table_name OBJECT,
inmemory INMEMORY,inmemory_priority PRIORITY,
inmemory_distribute DISTRIBUTE,inmemory_compression COMPRESSION,
inmemory_duplicate DUPLICATE
FROM all_tables
where owner='QUEST'
ORDER BY inmemory, owner||'.'||table_name;
OBJECT INMEMORY PRIORITY DISTRIBUTE COMPRESSION DUPLICATE
H_NATION ENABLED CRITICAL AUTO FOR QUERY HIGH NO DUPLICATE
H_REGION ENABLED CRITICAL AUTO FOR QUERY HIGH NO DUPLICATE
H_CUSTOMER
H_SUPPLIER
Im obigen Beispiel werden Sie feststellen, dass zwei der Tabellen – „Customer“ und „Supplier“ – keinen Wert für die Spalte INMEMORY haben. Das Attribut INMEMORY ist ein Attribut auf Segmentebene. Sowohl „Customer“ als auch „Supplier“ sind partitionierte Tabellen und daher logische Objekte. Das Attribut INMEMORY für diese Tabellen wird auf Partitions- oder Unterpartitionsebene in *_TAB_(SUB) PARTITIONS aufgezeichnet.
Drei zusätzliche Spalten – INMEMORY_PRIORITY, INMEMORY_DISTRIBUTE und INMEMORY_COMPRESSION – wurden ebenfalls zu den Ansichten *_TABLES hinzugefügt, um die aktuellen In-Memory-Attribute für jede Tabelle anzugeben.