Bonjour,
Ma base de données 11gR2 contient une table APPEL, qui comporte 20 colonnes et compte env. 3 millions de lignes.
5 indexes mono-colonne sont positionnés sur cette table, dont 1 sur la Primary Key (Id_Appel) qui est une colonne de type NUMBER.
Cela fonctionnait très bien jusqu'à ce que j'ajoute un 6ième index multicolonne sur cette table (incluant aussi la PK Id_Appel). Les temps de réponse se sont subitement dégradés.
Un simple "SELECT COUNT(*) FROM Appel" prenait plusieurs minutes au lieu d'être quasi-immédiat. J'ai donc supprimé l'index ajouté. Cela a résolu le problème de lenteur... pour un temps !
En effet, le lendemain, les temps de réponse de cette table étaient à nouveau exécrables. Je me suis aperçu qu'Oracle lançait son calcul de statistiques pour l'optimiseur vers 22h chaque soir. J'ai supposé que le problème venait de là et j'ai relancé le calcul complet de statistiques de l'optimiseurs. 2h après, le problème était résolu : les temps de réponse étaient redevenus normaux.
Ce matin (donc 4 jours après), alors que je n'ai fait aucune modification en base de données, les problèmes de lenteur sur cette table sont revenus !!! J'imagine que c'est l'optimiseur qui fait à nouveau des sienne... mais je n'ai rien changé !?
Questions :
- Pourquoi (C'est mon hypothèse) l'optimiseur n'utilise-t-il plus l'index sur la PK ? Comment le forcer à l'utiliser comme avant (sans utiliser des HINT) ?
- Pourquoi le problème revient-il 4 jours après alors que je n'ai rien changé dans la structure de la base de données entre-temps ?
- Quand on créé un index, à partir de quand est-il utilisé par l'optimiseur ? Quand on en supprime un, à partir de quand l'optimiseur voit-il qu'il n'existe plus et se rabat-il sur un autre index ?
Merci de votre aide sur ce problème critique.
Partager