Cache Buffer ChainDate de publication : 28/07/2005 Comprendre les mécanismes internes de verrouillage Introduction Latch free Cache buffer chain ( CBC ) issue du wait event ' Latch Free" A. v$session_wait B. v$latch_children Dictionnaire Introduction
Avant tout je tiens à préciser que cette note technique n'a pas pour but de vouloir être une référence technique concernant la résolution d'une anomalie de type : << LATCH FREE et CACHE BUFFER CHAIN>> . Elle a un but plus modeste qui consiste à apporter les outils nécessaires pour effectuer une analyse descendante : Drill and Down . J'espère que les requêtes fournies vous permettront de faire ressortir deux informations primordiales pour la résolution de votre anomalie :
Environnement Oracle : Oracle 8i
Latch free
Les latchs sont des mécanismes bas niveau protégeant les blocs de données en SGA .Bien que de bas niveau , les latchs à contrario des Verrous , ne possèdent que deux états possibles : libre ou occupé .Un verrou quant à lui possède plusieurs niveaux . Ainsi un process ayant obtenu le latch pour la modification d'une zone mémoire a l'assurance qu'aucun autre process ne peut modifier la même zone mémoire pendant que celui ci << travaille >> . Un latch peut être demandé de deux manières :
Cache buffer chain ( CBC ) issue du wait event ' Latch Free"
Les blocs sont placés dans le buffer cache dans une liste chaînée ( cache buffer Chain ) .Chaque chaîne est protégée par un seul verrou ( ou latch ) . Un processus doit avoir ce verrou s'il veut consulter les données . Ce type d'évènement : CBC n'est pas présent en tant que tel dans les vues d'observation V$session_wait , v$session_event ou même v$system_event .
A. v$session_wait
Lorsqu'on observe dans la vue v$session_wait un évènement de type latch free on peut collecter un certain nombre d'informations très importantes : Tout d'abord dans la colonne P2 donne le numéro de latch , le nom du latch peut être retrouvé ainsi :
Ensuite la colonne P1raw va nous permettre d'isoler la ressource qui est sujette à ce bloc chaud ( Hot bloc): Qu'est ce que le P1RAW : c'est une valeur hexadécimale spécifiant l'adresse du latch .Nous allons nous servir de cette valeur pour requêter sur la vue sys.x$bh Pour information P3 est un compteur qui va comptabiliser le nombre de fois ou le latch a été demandé et n'a pas été obtenu . En effet sous SYS :
Et grâce à la valeur de file# et de DBABLK ( block ) nous allons pouvoir retrouver le segment ( table ou index) qui est sujet à contention .Plus précisément la colonne FILE# est le numéro de fichier et le DBABLK est le numéro de bloc. toujours sous le compte sys ou internal ( version > 9i ) :
B. v$latch_children
Nous venons de nous intéresser à une vue micro ( sur une requête à un instant T ) , maintenant nous allons nous intéresser à une vue macro , à savoir tout les évènements d'attente depuis le démarrage de la base , pour ce faire la vue latch_children et la requête suivante vont nous aider . Cette démarche est plus dans une optique d'optimisation de l'instance que d'une requête ou d'un traitement .
La colonne RATIO est une colonne issue d'un calcul , déterminant le ratio qui existe entre misses et gets , : Détaillons cette requête ,chaque fois qu'un verrou est demandé sur un block de données , si oracle nous l'accorde de suite la colonne GET est incrémenté , sinon MISSES est incrémentée . Donc le ratio revient à poser la question suivante : Combien de fois un latch a été demandé et combien de fois il a été octroyé de suite ? Oracle recommande d'avoir un ratio inférieur à 1% , ici nous voyons que le ratio avoisine les 3 % ... Cependant comme tout ratio , cela doit être pondéré par le contexte de l'instance . Avec la colonne ADDR et en reprenant le même principe que vu précédemment , on peut retrouver le segment concerné A part les conseils classique de tuning concernant le code , je vous déconseille fortement de " tuner " les paramètres non documentés et cachés d'oracle :_db_block_hash_buckets et _db_block_hash_latches sans le support Oracle . Pour une table , on conseille en règle générale le partitioning et pour un index , « le reverse index » peut obtenir de bons résultats mais attention , si cet index est utilisé ailleurs en range scan , l'optimiseur COST peut dans ce cas choisir le FTS (Full Table Scan) .D'où la nécessité de construire des Histogrammes pour les colonnes indexées Lorsqu'on met en place un reverse index , deux méthodes permettent de diminuer les probabilités que l'optimiseur COST ou CHOOSE préfère un FTS au lieu d'un accès indexé : 1-Construire des histogrammes : La commande suivante permet de le faire :
Cependant pour les versions 8i ou supérieures préférez le paquetage : DBMS_STATS
Suite à « la mort » du process , c'est PMON (process monitor) qui libère le latch .Notamment lors d'un « SNAPSHOT TOO OLD ». Cependant , la construction des histogrammes ne renseignent que sur la distributivité des données , donc a un effet limité . Remarque : attention le latch free n'est pas en corrélation avec un cache hit ratio faible .Il ne sous-entend nullement une augmentation du cache size . Dictionnaire
Wait event : Evènement d'attente que l'on peut observer dans les vues systèmes Latch : Verrou Range Scan : Lecture par intervalle d'un index , cela se produit par exemple lorsque nous avons dans une clause where un between Reverse index : Index inversé , à savoir Oracle distribue les différentes valeurs d'un index afin d'avoir un Hot block , par exemple si nous avons deux valeurs : 1009 et 1010 qui sont fortement sollicitées , il y a un fort risque d'avoir un hot block , cette probabilité est réduite lorsque les valeurs sont inversées : 1010 devient 0101 et 1009 devient donc 9001 . Hot block : Bloc de données fortement accédé FTS ou Full table SCAN : Oracle va parcourir toute la table sans passer par un index .En règle générale l'événement d'attente associé est le DB_FILE_SCATTERED_READ . A contrario, une lecture d'index se traduit pas un événement DB_FILE_SEQUENTIAL_READ. Partitioning : Découper un Index ou une table sur plusieurs axes . Cost : L'optimiseur va calculer et choisir son chemin , en fonction de coût recueillis grâce notamment aux statistiques . CHOOSE : Choix entre COST et RULE. Rule : le mode RULE indique à Oracle de choisir le plan d'exécution en fonction de règles pré-établies par Oracle (ordre des tables dans la clause FROM par exemple). Ce mode est également utilisé lorsque aucune statistique n'est calculée sur les objets de la requête analysée par Oracle. Tuning : Littéralement réglage mais ici nous parlerons plus dans le sens d'optimisation ( bien qu'un bon réglage apporte également une optimisation) . X$tables : Ces tables existent directement dans la SGA , donc on consulte la SGA lorsque l'on ces interrogent ces tables .En effet ces tables existent uniquement lorsque l'instance est démarré .Pour voir ces tables il est préférable d'être connecté en SYS .La x$BH est une vue sur les cache buffer chain accédés . |
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2005 . Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.