Overblog
Editer l'article Suivre ce blog Administration + Créer mon blog
27 janvier 2009 2 27 /01 /janvier /2009 15:50
Bonjour,

Lorsqu'une application a un peu de vécu, il arrive que l'on se demande si tel index est utilisé ou pas.
En effet la présence d'un index a un impact sur :
  • La taille de la base
  • Les performance lors d'opération d'INSER, UPDATE , ou DELETE puisqu'il faut au passage mettre à jour les indexes.
Donc si un index n'est pas utilisé, il n'a aucune raison d'exister. Sauf  si on aime a penser que peut etre un jour il sera utilisé.


Admettons que vous aillez un doute sur l'utilisation d'un index que l'on appellera "mon_index". Il va suffir de le monitorer et de voir si il est utilisé.


ALTER INDEX mon_index MONITORING USAGE;


Il suffit ensuite d'interroger la vue v$object_usage pour savoir si l'index a été utilisé.
Dans cette vue nous avons les colonnes suivante:
  • Index_Name
  • Table_Name
  • Monitoring
  • USED
  • Start_Monitoring
  • End_Monitoring
Si l'index a été utilisé, alors la colonne USED prends la valeur YES.

Une fois que l'on pense avoir sa réponse, ou que l'on estime que l'on est passé dans toutes les requetes pouvant potentiellement utiliser cet index, on peut alors stopper le monitoring.


ALTER INDEX mon_index NOMONITORING;



Remarque: Une fois qu'un index a été monitoré, la trace est conservée dans la vue v$object_usage (d'ou l'interet de la colonne End_Monitoring).

Attention : La méthode décrite ici, indique seulement qu'un index n'a pas été utilisé. Cela ne permet pas de conclure que l'index est inutile. Cela peut permettre par exemple de mettre en evidence que les stats ne sont pas à jour, ou que les paramètres de base sont mal initialisés.....

Re Attention : L'utilisation de ce type de monitoring doit également est effectué avec quelqu'un qui maitrise le fonctionnel. En effet, si vous décidez de supprimer un index car non utilisé sur plusieurs mois et que manque de pot,il était utile sur un traitement annuel, vous pouvez plombez les performances. "Sans controle, la puissance n'est rien..."

LAO.
Partager cet article
Repost0

commentaires

E
Bonjour LAO,<br /> très sympa et surtout très constructif ton blog... j'aime bcp la manière comme tu expliques nos petits soucis et exploits avec nos bases Oracle... <br /> D'autre part, j'ai une petite question : <br /> tu lances ce type de syntaxe ALTER INDEX mon_index MONITORING USAGE; sur un index que tu doutes son efficacité. Est-ce qu'il existe un query plus général pour avoir un résumé des tous les index existants sur un schéma? <br /> Merci d'avance.<br /> <br /> PS. pour Frank : j'ai utilisé la syntaxe donné par LAO "Select * from ma_table where CONTAINS(champ,valeur)>0;" pour une recherche des mots sur une colonne de type CLOB; nous avons utilisé effectivement Oracle Text pour ce type de recherche!<br /> Mais ça reste très consommateur! =/
Répondre
L
<br /> Bonjour,<br /> <br /> Merci pour les encouragements. Il existe beaucoup de vues system qui donnent ce type d'informations. Pour les indexes tu as par exemple la vue USER_INDEXES qui te donnera la liste de tous les<br /> indexes sur un schemas.Ou encore USER_IND_COLUMNS qui pour chaque indexe te donnera la liste des colonnes indexées.<br /> <br /> LAO.<br /> <br /> <br />
F
Re... je sais, j'suis casse-pieds avec mon XML. En fait, Oracle propose tout un langage d'interrogation particulier pour le XML. Le FULL TEXT search, n'est pas bon lorsque l'on recherche sur des noeuds particulier du document XML.<br /> <br /> Voici un exemple, imagine le document XML suivant:<br /> <br /> <br /> DUPONT<br /> Pierre<br /> 10 avenue des Champs Elysées, Paris<br /> <br /> <br /> <br /> Imagine que chaque ligne de la table contienne quelque chose d'équivalent. Maintenant, je voudrais faire une requête de type : Donne moi tous les clients dont le nom est DUPONT. En Oracle, format XML, j'écrirai ça:<br /> <br /> SELECT * FROM Ma_TABLE WHERE extractValue(ma_col_xml,'/root/client[nom=''DUPONT'']') IS NOT NULL;<br /> <br /> (nb: j'ai pas vérifié exactement la syntaxe, mais c'est un truc du genre).<br /> <br /> Alors ma question est qu'en est-il de ce type de données et d'index. En plus, j'ai cru entendre parlé de fonctionnalité vraiment particulière pour la gestion des bases de données en XML par Oracle.
Répondre
F
Super ta réponse... bah moi j'aime.<br /> Non, pour être plus précis, c'est dans le cadre des solutions SOA. Certains proposent de stoquer dans la base de données les informations en XML afin d'éviter la transformation structure BDD en structure XML. Ainsi on gagnerai du temps. Personnellement je ne suis pas pour car on mélange les concepts et surtout on induit au niveau de la base de données une logique liée à l'implémentation : on crée donc une dépendance forte entre la structure de données et les couches supérieures des applications. Cependant, je trouvais l'idée intéressante et je voulais savoir si les colonnes XML offrait les mêmes capacités d'exploitation que les colonnes "classiques".<br /> <br /> Merci d'avance de ta réponse construite et pertinente :D
Répondre
L
<br /> Je ne réponds à ce genre de question que devant une bière. Sinon, je suppose que ton xml va être stocké dans un clob ou un champ de type XML. De toute facon, au final,il ne s'agira pas d'une<br /> indexation classique mais d'un index de type FULLTEXT.<br /> Pour faire le lien avec l'article en question, le "ALTER INDEX ... MONITORING USAGE" ne fonctionnera pas sur un index FULL TEXT.<br /> D'un autre coté est-ce vraiment utile. En général, on ne crée pas un index FULL TEXT pour le fun, mais ensuite on requete via des expression du type "Select * from ma_table where<br /> CONTAINS(champ,valeur)>0;"<br /> Et dans ce cas, l'index est forcément utilisé.<br /> <br /> LAO.<br /> <br /> Je n'aime toujours pas le XML.<br /> <br /> <br />
F
Salut LAO,<br /> <br /> Intéressant cet article. Juste une question, on m'a dit que Oracle proposait comme DB2 la création d'index sur des colonnes de types XML. Est-ce que ta technique marche aussi ?<br /> <br /> Merci
Répondre
L
<br /> J'aime pas le XML.<br /> <br /> <br />