Recommandations pour Oracle
Si vous êtes administrateur de base de données, vous souhaitez que les performances de votre base de données soient optimales. Cette rubrique propose des recommandations de base pour les installations avec bases de données Oracle.
Cette rubrique contient les sujets suivants :
Recommandations générales
-
Réorganisez régulièrement la base de données Automation Engine (y compris tous les clients).
-
Avoir une connexion réseau Gigabit entre les instances de Automation Engine et la base de données, avec le moins de composants possibles sur le chemin.
-
Si les fichiers de données de la base de données sont stockés en externe, vous devez tenir compte de la vitesse du sous-système de disque externe, ainsi que de sa connexion haute performance (telle que Fibre Channel).
-
Il est recommandé d'utiliser le même matériel pour tous les nœuds de clusters.
-
Pour toute information sur les prérequis d'installation, voir Configuration système requise et dimensionnement AWA.
Recommandations relatives à la configuration
-
Ne limitez pas la consommation de ressources. Les transactions interrompues dues aux limitations spécifiées dans la base de données ralentissent le traitement dans le système Automation Engine. De plus, cela peut engendrer des contenus incohérents de la base de données et déclencher des erreurs consécutives ou des boucles infinies.
-
Dans la variable UC_HOSTCHAR_DEFAULT - Caractéristiques de l'hôte définissez la clé REPORT_BLKSIZE=8000.
-
Dans UC_SYSTEM_SETTINGS - Paramètres système, définissez :
- REPORT_BLKSIZE=8000
-
LAST_USE=0
Ce paramètre affecte les performances de l'environnement RAC/Data Guard en particulier, mais peut également améliorer les performances des bases de données autonomes.
-
Optimisez la connexion TCP/IP. Dans le fichier SQLNET.ORA, définissez tcp.nodelay = yes (valide pour le client et le serveur de base de données).
Lorsqu'un message n'est pas plus long qu'un bloc de transport logique, il doit être divisé en plusieurs blocs. Le paramètre ci-dessus a pour effet que cela peut se produire sans attendre la réponse TCP/IP. Cela permet d'accroître les performances d'Oracle. -
Activez la Détection de perte de connexion car Oracle a besoin de ce paramètre pour détecter toute interruption de Automation Engine. Dans le fichier SQLNET.ORA, définissez SQLNET.EXPIRE_TIME sur 1 minute maximum (valide pour le serveur de base de données). C'est l'intervalle pendant lequel le serveur vérifie si les sessions du client sont toujours actives. Le serveur de base de données ferme les sessions sans réponse.
-
Définissez le paramètre SE tcp_keepalive <= 5 minutes (valide pour le client de base de données).
Ce paramètre est nécessaire pour s'assurer de la bonne détection de toute coupure de connexion sur un client de base de données lorsque le serveur de base de données n'est plus en mesure de terminer une session de base de données, que ce soit de manière contrôlée ou via la Détection de perte de connexion. Les connexions TCP existantes sont vérifiées dans l'intervalle prédéfini et, sans réponse du partenaire de connexion, la connexion se termine automatiquement. La session de base de données associée se termine et le client Oracle peut envoyer un rapport d'erreur à AE, de manière à ce qu'une nouvelle connexion puisse être établie. -
Dans le fichier TSNAMES.ORA, définissez set enable = broken (valide pour le client de base de données).
Ce paramètre doit être le premier de l'entrée complète dans tnsnames, tel qu'illustré ci-dessous :UC4P =
(DESCRIPTION =
(ENABLE=BROKEN)
(ADDRESS = (PROTOCOL = TCP)(HOST = dbhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED) (SERVICE_NAME = UC4P)
)
)
-
Lors de la configuration de la base de données, ses tables doivent avoir la taille appropriée. Le tableau suivant propose un aperçu des tailles recommandées, en pourcentage. Dans un environnement productif, la base de données doit avoir une taille de 2 à 4 Go. Pour des installations très complexes, la taille de la base de données peut être de 10 à 20 fois supérieure. Étendez les tables à une taille fixe dès le début et ne limitez pas les extensions.
-
RT : 40% - 60%
-
AH : 20% - 30%
-
MELD : 10% - 20%
-
AJPP : 5%
-
RH : 5%
-
Autres tables : < 1%
-
-
Vérifiez que les index sont régulièrement réorganisés.
Maintenance régulière de la base de données Oracle
-
Créez des tablespaces pour Automation Engine avec ASSM (Automatic Segment Space Management).
Outre les avantages que cela représente en termes de performances pour l'insertion de données, ASSM permet également une réorganisation transparente des tables.
-
Utilisation des disques locaux
Si la base de données n'est pas installée sur un sous-système de disque externe, les fichiers de données de l'index et des tablespaces de données (UC4_INDEX, UC4_DATA) doivent être conservés sur des disques physiquement séparés, pour un rendement E/S maximum.
Afin d'améliorer encore les E/S, les tables E*, A*, R* et MELD, ainsi que les tables temporaires AE (UC_TEMP*, MQ*) doivent se trouver dans leurs propres tablespaces ou fichiers de données sur des disques physiquement séparés. Pour ce faire, vous devez créer des tablespaces de données supplémentaires (tels que UC4_DATA_E, UC4_DATA_A, UC4_DATA_R, UC4_DATA_M, UC4_DATA_T). Cependant, la répartition finale des fichiers de données dépend toujours de vos besoins et de l'infrastructure disponible.
-
Réorganisation avec la base de données signifie
Vous devez utiliser Oracle SEGMENT ADVISOR ici. Il génère une liste de toutes les tables / index à réorganiser. Vous pouvez également le faire manuellement, mais cela implique des modifications importantes de la base de données AE.
Exemple
Réorganisation de l'index en ligne :
sqlplus> alter index <index_name> rebuild online;
Statistiques
Les statistiques d'accès des tables de base de données doivent être régulièrement actualisées. Cela se fait avec un job de mise à jour quotidienne (GATHER_STATS_JOB) qui est automatiquement planifié comme faisant partie de l'installation de la base de données, sauf si vous désélectionnez cette option. Vous pouvez librement sélectionner l'heure de la mise à jour quotidienne. Elle doit se faire de préférence lorsque le système AE subit de fortes charges, afin que vous puissiez obtenir des valeurs représentatives. En l'absence de mise à jour automatique contrôlée par Oracle, vous pouvez planifier une mise à jour dans Automation Engine.
Exemples
Instruction SQL pour mettre à jour les statistiques de la base de données UC4 (1 ligne) :
exec dbms_stats.gather_schema_stats('UC4',options=>'GATHER AUTO', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, method_opt => 'FOR ALL COLUMNS SIZE AUTO', cascade => TRUE);
Vous pouvez également utiliser une instruction pour générer des statistiques mieux adaptées :
exec dbms_stats.gather_schema_stats('UC4',options=>'GATHER AUTO', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, method_opt => 'FOR ALL INDEXED COLUMNS SIZE AUTO', cascade => TRUE);
Afin de vérifier l'emplacement et le moment des dernières statistiques, accédez à la vue USER_TABLES :
sqlplus>select TABLE_NAME,NUM_ROWS,LAST_ANALYZED from USER_TABLES;
Exception
Il n'est pas nécessaire de créer des statistiques d'accès pour les tables UC_TEMP* tables (UC_TEMP, UC_TEMP1, UC_TEMP2, UC_TEMP3,). Vous devez donc supprimer toutes les statistiques éventuellement disponibles pour ces tables, et verrouiller les tables, afin de permettre la création de nouvelles statistiques.
Instructions SQL pour la création automatique de statistiques :
exec dbms_stats.delete_table_stats('uc4','UC_TEMP');
exec dbms_stats.lock_table_stats('uc4','UC_TEMP');
exec dbms_stats.delete_table_stats('uc4','UC_TEMP1');
exec dbms_stats.lock_table_stats('uc4','UC_TEMP1');
exec dbms_stats.delete_table_stats('uc4','UC_TEMP2');
exec dbms_stats.lock_table_stats('uc4','UC_TEMP2');
exec dbms_stats.delete_table_stats('uc4','UC_TEMP3'); e
exec dbms_stats.lock_table_stats('uc4','UC_TEMP3');
Fragmentation
Il peut arriver que le nombre d'entrées des queues de message AE (tables MQ*) augmente considérablement (plusieurs 10000 d'entrées) en raison d'un dysfonctionnement, et que ces tables soient très fragmentées. Cela peut avoir un impact négatif sur les performances du système AE car ces tables sont les plus utilisées. Pour résoudre ce problème de fragmentation, il existe deux options, en ligne et hors ligne.
Liste des tables MQ
Les tables MQ sont des tables dont le nom comporte le préfixe "MQ". Le nombre de tables MQ dépend de la configuration du système AE, et en particulier le nombre de tables "MQnCP*", qui peut varier.
Exemple : l'instruction SQL suivante extrait une liste de tables MQ.
select TABLE_NAME from user_tables where TABLE_NAME like 'MQ%';
Réorganisation hors ligne de toutes les tables MQ
Cela nécessite un arrêt du système AE. Arrêtez le système AE, tel que décrit dans Démarrer et arrêter des processus serveur.
Lancez le système AE avec un démarrage à froid, "COLD" (définissez StartMode=COLD dans le fichier ucsrv.ini ou via le menu contextuel de la boîte de dialogue Service Manager).
Le démarrage à froid du système nettoie les queues de messages AE, ce qui implique, en principe, qu'elles seront tronquées. Pour une troncation manuelle, vous pouvez utiliser les instructions SQL suivantes, pendant que le système AE est arrêté.
Important ! Effectuez une sauvegarde avant de commencer à modifier la base de données.
SET SERVEROUTPUT ON
BEGIN
FOR c IN (SELECT TABLE_NAME FROM user_tables WHERE TABLE_NAME LIKE 'MQ%')
LOOP
dbms_output.put_line (c.TABLE_NAME || ' Table will be truncated now ...');
EXECUTE immediate 'truncate table ' || c.TABLE_NAME ;
dbms_output.put_line (c.TABLE_NAME || ' Table was truncated.');
END LOOP;
END;
Réorganisation en ligne
Le système AE reste en ligne, dans ce cas.
Il est recommandé de confier la réorganisation en ligne des tables à un administrateur de base de données (DBA), afin de s'assurer que la base de données (tables MQ*) reste disponible pour AE pendant le processus de réorganisation. Cela permet d'éviter les situations de blocage, ou de les détecter et de les résoudre immédiatement.
Vous trouverez un exemple de meilleure pratique pour une procédure exécutant ce type de réorganisation avec le schéma de la BDD (UC_REORG dans le dossier Procedure de votre base de données Oracle).
Vérifier la fragmentation des tables MQ
L'instruction suivante génère des instructions de vérification pour chaque table MQ. Notez que vous devez l'exécuter en tant que propriétaire de schéma :
select 'select get_block_count(''' || table_name || ''') from dual;' ResultToExecute from user_tables where table_name like 'MQ%';
Vous pouvez prendre le résultat et l'exécuter pour voir la fragmentation actuelle. Selon votre environnement, un nombre de blocs supérieur à 64 peut donner lieu à une réorganisation. Au delà de 64, vous pouvez exécuter une réorganisation et surveiller la fragmentation en situation de charges normale et élevée. Si ce nombre augmente, vous pouvez l'utiliser comme base pour votre système.
Exemple
Demande de résultat :
select get_block_count('MQ1CP001') from dual;
Si le nombre obtenu est 1000, cette table est candidate pour une réorganisation. Exécutez alors la procédure suivante :
call uc_reorg('MQ1CP001');
Adapter les paramètres de base de données
Taux de réussite du cache tampon
En principe, le taux de réussite du cache tampon doit être supérieur à 98%. Le script suivant est un exemple de calcul de la valeur actuelle.
Calculer le taux de réussite du cache tampon :
-- DB_BLOCK_BUFFERS: 'buffer cache hit rate %' should be > 98% execute dbms_output.put_line(chr(9));
execute dbms_output.put_line(chr(9));
execute dbms_output.put_line('>>>>>> DB_BLOCK_BUFFERS: "buffer cache hit rate %" should be > 98%');
execute dbms_output.put_line(chr(9)); declare dbg number;
cg number;
pr number;
begin
select value into dbg from v$sysstat
where name = 'db block gets'; select value into cg
from v$sysstat
where name = 'consistent gets'; select value into pr
from v$sysstat
where name = 'physical reads'; dbms_output.put_line('db block gets
|'||to_char(dbg,'999G999G999G999')); dbms_output.put_line('consistent gets
|'||to_char(cg,'999G999G999G999')); dbms_output.put_line('physical reads
|'||to_char(pr,'999G999G999G999'));
dbms_output.put_line('---------------------------------------- ');
dbms_output.put_line('buffer cache hit rate in % |'|| to_char (round(100*(1-(pr/(dbg+cg))),2),'999D00')); end;
/
Taux de réussite mémoire
En principe, le taux de réussite mémoire de la zone de tri doit être supérieur à 99%. Le script suivant est un exemple de calcul de la valeur actuelle.
-- SORT_AREA_SIZE: memory hit rate % should be > 99%
execute dbms_output.put_line(chr(9));
execute dbms_output.put_line(chr(9));
execute dbms_output.put_line('>>>>>> SORT_AREA_SIZE: "memory hit rate %" should be > 99%');
execute dbms_output.put_line(chr(9));
declare sm number;
sd number;
begin
select value into sm
from v$sysstat
where name = 'sorts (memory)';
select value into sd
from v$sysstat
where name = 'sorts (disk)';
dbms_output.put_line('sorts (memory)
|'||to_char(sm,'999G999G999'));
dbms_output.put_line('sorts (disk)
|'||to_char(sd,'999G999G999'));
dbms_output.put_line('-------------------------------');
dbms_output.put_line('memory hit Rate %
|'|| to_char (round(100-(100*sd/sm),2),'999D00'));
end;
/
Taille du pool partagé
Sur le nombre total de tous les accès, le pourcentage d'accès infructueux au cache de la bibliothèque de pool partagé doit généralement être largement inférieur à 1%. Le script suivant est un exemple de calcul de la valeur actuelle.
-- SHARED_POOL_SIZE: 'Misses %' should be << 1%
execute dbms_output.put_line(chr(9));
execute dbms_output.put_line(chr(9));
execute dbms_output.put_line('>>>>>> SHARED_POOL_SIZE:
"Misses %" should be << 1%');
column 'misses %' format a10
select sum(pins) "Executions",
sum(reloads) "Cache Misses while Executing",
to_char(sum(reloads)/(sum(pins)+sum(reloads))*100,'990D0000')
"Misses %"
from v$librarycache
Memory Advisor
Vous pouvez également utiliser l'optimiseur de mémoire Memory Advisor pour cela. PGA_AGREGATE_TARGET doit être utilisé.
Voir aussi :