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.
- 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).
- 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.
- 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 :
- Un pool de 1 Mo : stocke les données réelles au format colonne
- 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.