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

Comment configurer l’option Oracle Database 12c In-Memory

Summary: Notre objectif est d’offrir des solutions qui simplifient l’informatique en fournissant des solutions de base de données, un développement personnalisé, des centres de données dynamiques et des solutions informatiques flexibles. ...

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

S’applique à : 
Oracle Database – 12.1.0.2

Auteur :

Mahesh Reddy M

Introduction :

Avec l’introduction d’Oracle Database 12c In-Memory, une seule base de données peut désormais prendre en charge efficacement des charges de travail mixtes, pour garantir des performances transactionnelles optimales tout en prenant en charge l’analytique et la création de rapports en temps réel. In-Memory permet aux datamarts et aux entrepôts de données d’augmenter leurs capacités analytiques ad hoc, ce qui offre aux utilisateurs la possibilité de soumettre plusieurs requêtes stratégiques pendant la durée habituellement nécessaire pour l’exécution d’une seule requête. Cette fonction vous permet de stocker en mémoire des colonnes, des tables, des partitions et des vues matérialisées dans un format en colonnes, au lieu du format de ligne classique. L’ensemble de correctifs 12.1.0.2 était essentiellement concentré sur la fonctionnalité In-Memory Column Store (IM Column Store).

Architecture d’Oracle Database 12c In-Memory :

Traditionnellement, les données sont uniquement stockées au format ligne ; dans In-Memory Database, en revanche, les données sont stockées uniquement au format colonne. Oracle Database 12c prend donc en charge une architecture double format.
  1. Chaque fois que des données sont demandées pour des opérations de lecture/écriture (manipulations de données), elles sont chargées dans l’espace Row Store traditionnel (cache de mémoire tampon).
  2. Chaque fois que des données sont demandées pour des opérations en lecture seule, elles sont reflétées dans un nouvel espace de stockage In-Memory Column Store. Ces données sont bien évidemment converties du format ligne au format colonne.
  3. Chaque fois qu’une transaction qui inclut des insertions, des mises à jour ou des suppressions est validée, les nouvelles données s’affichent immédiatement et simultanément au format ligne (Row Store) et au format colonne (Column Store) d’In-Memory. Les deux espaces de stockage sont donc cohérents sur le plan transactionnel
Espace de stockage In-Memory Column Store :

La base de données in-Memory utilise un espace de stockage appelé In-Memory Column Store, qui est un nouveau composant de la System Global Area (SGA), appelée In-Memory Area. Les données d’In-Memory Column Store n’utilisent pas le format ligne traditionnel, mais un nouveau format de colonne. L’espace de stockage In-Memory Column Store ne remplace pas le cache de la mémoire tampon, mais intervient en complément, de sorte que les données peuvent désormais être stockées dans la mémoire au format ligne et au format colonne.

L’espace In-Memory Area désigne un pool statique intégrée à la SGA, dont la taille est contrôlée par le paramètre d’initialisation INMEMORY_SIZE (valeur par défaut : 0). La taille actuelle de l’espace In-Memory Area est visible dans V$SGA

IM Column Store est sous-divisé en deux pools :
  1. Un pool de 1 Mo : stocke les données réelles au format colonne
  2. Un pool de 64 Ko : stocke les métadonnées sur les objets.
La requête ci-dessous permet de voir la quantité de mémoire disponible dans chaque pool.

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
Tableau 1 : Mémoire disponible dans chaque pool

Activer l’espace IM Column Store :

En tant que pool statique, toute modification du paramètre INMEMORY_SIZE ne prendra effet qu’au redémarrage de l’instance de base de données. De même, le composant AMM (Automatic Memory Management) n’a aucun contrôle ou effet sur ce paramètre. L’espace In-Memory Area doit avoir une taille minimale de 100 Mo.

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.

We can see the In-Memory settings using below query

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

Nous pouvons également définir le paramètre inmemory_size aux niveaux de la CDB et de la PDB. Si vous définissez ce paramètre au niveau de la PDB, il n’est pas nécessaire de redémarrer l’instance ou la PDB. La somme de toutes les valeurs de PDB est inférieure à la valeur de la CDB.

Vous pouvez activer et désactiver l’option In-Memory au niveau de la PDB comme illustré ci-dessous

Connectez-vous à la PDB, puis exécutez la commande ci-dessous.

Désactiver :

Alter system set inmemory_size=0; or

Alter system reset inmemory_size;

Activer :

Alter system set inmemory_size=20G;

In-Memory priority levels:

L’espace IM Column Store doit se remplir avec les données les plus critiques de la base de données. Les données qui exigent moins de performances peuvent résider sur des disques Flash ou des disques moins coûteux. Naturellement, si votre base de données est suffisamment petite, vous pouvez renseigner toutes vos tables dans l’espace de stockage IM Column Store. Database In-Memory ajoute un nouvel attribut INMEMORY pour les tables et les vues matérialisées.

Nous pouvons activer l’attribut INMEMORY au niveau

du tablespace, de la table, de la (sous-)partition et de la vue matérialisée.

Si vous activez cet attribut au niveau du tablespace, toutes les tables et les vues matérialisées dans le tablespace seront activées par défaut pour l’espace de stockage IMCOLUMN.

alter tablespace quest INMEMORY;

Si vous activez cet attribut au niveau de la table, toutes les colonnes du tableau doivent être insérées dans l’espace de stockage IMCOLUMN. Toutefois, il est possible de remplir uniquement un sous-ensemble de colonnes dans IMCOLUMN.

Alter table quest_tab INMEMORY NO Inmemory (EMP);

De même, pour une table partitionnée

Alter table quest_tab INMEMORY MODIFY Partition  quest_part_1 No Inmemory;

Processus en arrière-plan :

IMCO : le processus en arrière-plan IMCO lance le remplissage (pré-remplissage) d’objets activés en mémoire ayant une priorité LOW/MEDIUM/HIGH/CRITICAL.

SMCO : SMCO génère dynamiquement des processus esclaves (Wnnn) pour mettre en œuvre ces tâches.

Wnnn : les processus Wnnn exécutent des tâches de remplissage en mémoire et de re-remplissage en mémoire pour le remplissage ou le re-remplissage d’objets activés en mémoire.

Les objets sont insérés dans l’espace IM Column Store soit dans une liste hiérarchisée immédiatement après l’ouverture de la base de données, soit une fois qu’ils ont été analysés (interrogés) pour la première fois. L’ordre dans lequel les objets sont insérés est contrôlé par le mot-clé PRIORITY, qui comporte cinq niveaux. La sous-cause PRIORITY est définie par défaut sur NONE, qui signifie qu’un objet est inséré uniquement après qu’il a été analysé pour la première fois.

Différents niveaux de priorité sont contrôlés par la sous-clause PRIORITY de la clause INMEMORY
Description du niveau de priorité

CRITICAL        L’objet est inséré immédiatement après l’ouverture de la base de données.

HIGH        L’objet est inséré une fois que tous les objets de niveau CRITICAL ont été insérés                                             

MEDIUM        L’objet est inséré une fois que tous les objets de niveaux CRITICAL et HIGH ont été insérés

LOW        L’objet est inséré une fois que tous les objets de niveaux CRITICAL, HIGH et MEDIUM ont été insérés

NONE        Les objets ne sont insérés qu’une fois qu’ils ont été analysés pour la première fois (par défaut)

 Les objets d’une taille inférieure à 64 Ko ne sont pas remplis dans la mémoire, car ils gaspillent une quantité considérable d’espace dans la zone de stockage IM Column Store, puisque la mémoire est allouée par fragments de 1 Mo.

Ex : alter table quest inmemory priority critical;

Techniques de compression d’In-Memory :

L’espace IM Column Store utilise des formats de compression spéciaux optimisés davantage pour la vitesse d’accès que pour la réduction du stockage. La base de données augmente la vitesse de la manière suivante :
  • Les formats de compression permettent à la base de données de réduire la quantité de mémoire traitée pour chaque colonne. SQL s’exécute directement sur les colonnes compressées.
  • La base de données utilise des instructions vectorielles (matricielles) SIMD pour traiter une matrice de valeurs de colonne dans un seul cycle d’horloge du processeur. La base de données peut stocker de nombreuses valeurs dans un vecteur, ce qui optimise les gains de performances avec le traitement vectoriel SIMD.
La compression In-Memory est spécifiée à l’aide du mot clé MEMCOMPRESS, une sous-clause de l’attribut INMEMORY. Il en existe six niveaux, chacun offrant un niveau de compression et de performances différent.

No Memcompress : les données sont remplies dans la mémoire sans compression.

Memcompress for DML : principalement destiné pour les performances DML et une compression minime.

Memcompress for Query Low : optimisé pour les performances de requête (par défaut).

Memcompress for Query High : optimisé pour les performances de requête et l’économie d’espace

Memcompress for Capacity Low : plus d’économie d’espace qu’avec les niveaux Query High et Low

Memcompress for Capacity High : optimisé pour l’économie d’espace avec des performances légèrement inférieures.

Les taux de compression peuvent varier de 2X à 20X, selon l’option de compression choisie, le type de données et le contenu de la table.

Ex : alter table quest inmemory memcompress for query high;

Espace In-Memory Column Store sur RAC :

Dans un environnement de cluster, chaque nœud dispose de son propre magasin de colonnes. Chaque nœud du cluster doit être maintenu à la même taille que celle d’IM Column Store. Par défaut, tous les objets insérés dans la mémoire sont répartis sur tous les espaces IM Column Store du cluster. La répartition des objets sur l’ensemble des espaces IM Column Store d’un cluster est contrôlée par deux sous-clauses supplémentaires de l’attribut INMEMORY : DISTRIBUTE et DUPLICATE (systèmes Engineered uniquement).

Distribute :

Les objets sont répartis sur l’ensemble du cluster contrôlé par la sous-clause Distribute. Vous pouvez répartir les objets de la façon suivante :

Distribute by rowed ranage : permet de répartir les objets par ligne sur différents nœuds

Distribute by Partition : permet de répartir les partitions sur les nœuds du cluster

Distribute by sub partition : permet de répartir la sous-partition sur des nœuds différents.

Ex : alter table quest inmemory distribute by partition;

Il est ici important de souligner le fait qu’Oracle In-Memory RAC est une architecture de type Shared-Nothing pour les requêtes. En d’autres termes, si vous émettez une requête pour des objets de données en mémoire (en supposant que les objets sont répartis dans deux espaces IM Column Store), vous pouvez accéder uniquement aux données qui se trouvent dans le nœud Affinity. Cela signifie que les IMCU (In-Memory Compression Units) ne sont pas partagées entre les instances du cluster.

Par conséquent, vous pouvez définir le degré de parallélisme (DOP) sur Auto. Le coordinateur de requêtes parallèles identifie les autres instances de l’emplacement des IMCU. Si vous ne pouvez pas définir le DOP sur AUTO, le coordinateur de requêtes parallèles n’utilisera pas les autres instances d’IMCU.

set the degree of parallel to auto

alter system set parallel_degree_policy=AUTO scope=both sid='*';

Duplicate :

Pour augmenter la disponibilité, les objets sont copiés dans toutes les instances. Vous pouvez utiliser la sous-clause Duplicate pour spécifier la table In-Memory qui est stockée dans toutes les instances dans le cluster. Pour les systèmes autres que Engineered, cette option ne fonctionne pas.

Ex : alter table quest inmemory duplicate all;

       quest table is stored in all instances.

Surveillance des objets en mémoire :

Pour la surveillance des objets indisponibles, Oracle a introduit deux nouvelles V$views :

v$IM_SEGMENTS ou  v$IM_USER_SEGMENTS et v$IM_COLUMN_LEVEL.

Ces vues permettent de déterminer le nombre d’objets actuellement insérés dans l’espace de stockage IMCOLUMN.

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

  Dans l’exemple ci-dessus, vous remarquerez que deux des tables (Customer et Supplier) ne comportent aucune valeur pour la colonne INMEMORY. L’attribut INMEMORY est un attribut de niveau segment. Les tables Customer et Supplier sont des tables partitionnées et sont donc des objets logiques. L’attribut INMEMORY pour ces tables sera enregistré au niveau de la partition ou de la sous-partition dans *_TAB_ (SUB) PARTITIONS.

Trois colonnes supplémentaires (INMEMORY_PRIORITY, INMEMORY_DISTRIBUTE et INMEMORY_COMPRESSION) ont également été ajoutées aux vues *_TABLES pour indiquer les attributs In-Memory actuels pour chaque table.
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.