Skip to main content
  • Place orders quickly and easily
  • View orders and track your shipping status
  • Enjoy members-only rewards and discounts
  • Create and access a list of your products

Wie konfiguriere ich die In-Memory-Option für die Oracle Datenbank 12c?

Summary: Unser Ziel besteht darin, Lösungen zu liefern, die den IT-Alltag vereinfachen, z. B. Datenbanklösungen, benutzerdefinierte Entwicklung, dynamische Rechenzentren, flexible Datenverarbeitung. ...

This article applies to This article does not apply to This article is not tied to any specific product. Not all product versions are identified in this article.

Symptoms

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.
  1. Wenn Daten für Lese-/Schreibvorgänge (Datenmanipulationen) angefordert werden, werden sie in den traditionellen Zeilenspeicher (Puffercache) geladen.
  2. 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.
  3. 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. 1-MB-Pool – Speichern der tatsächlichen spaltenformatierten Daten
  2. 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.
Article Properties
Article Number: 000124827
Article Type: Solution
Last Modified: 21 Feb 2021
Version:  3
Find answers to your questions from other Dell users
Support Services
Check if your device is covered by Support Services.