Mardi 27 janvier 2009
2
27
/01
/Jan
/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.
Pour faire le lien avec l'article en question, le "ALTER INDEX ... MONITORING USAGE" ne fonctionnera pas sur un index FULL TEXT.
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 CONTAINS(champ,valeur)>0;"
Et dans ce cas, l'index est forcément utilisé.
LAO.
Je n'aime toujours pas le XML.
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...
D'autre part, j'ai une petite question :
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?
Merci d'avance.
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!
Mais ça reste très consommateur! =/
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 indexes sur un schemas.Ou encore USER_IND_COLUMNS qui pour chaque indexe te donnera la liste des colonnes indexées.
LAO.