Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Oracle - Liste des index non utilisés

3 réponses
Avatar
Eric Latombe
Hello,

J'ai une application de type datawarhouse assez complexe (plusieurs
centaines de tables, d'index, et plusieurs milliers de traitements).

Les tables sont définis bien souvent avec tout un ensemble d'index.

Pour des raisons d'optimisation lors de modification de ces tables (delete,
insert, update) je me dis que peut etre un certain nombre d'index ne sont
jamais utilisé dans une clause "where" et il serait donc interessant de les
supprimer définitivement.
Ainsi je gagnerai du temps sur les insert, update, delete sans pour autant
dégrader les performances sur les select car ces index ne sont jamais
utilisés.

Ma question est donc de savoir s'il existe dans des vues système Oracle un
moyen simple de lister l'ensemble des index qui n'ont jamais été utilisé
dans une clause "where" d'une requête depuis le dernier démarrage de la
base. (Pour info la base n'est arrété qu'une fois par semaine pour faire
une sauvegarde à froid).

Une méthode TRES TRES TRES lourde et fastidieuse serait de faire un explain
plan de chaque requête de l'application et de lister l'ensemble des index
utilisé mais vu le nombre de requêtes (plusieurs milliers il n'est pas
possible d'utiliser cette méthode).

Un,e autre méthode TRES TRES TRES lourde serait de supprimer un à un les
index et de voir après coup si l'application marche encore ... mais ça
prendrait des années à tout tester ...


Quelqu'un aurait il une solution "miracle" ?

Merci

3 réponses

Avatar
zeb
"Eric Latombe" a écrit dans le message de news:
4119a68f$0$9763$

Hello,

J'ai une application de type datawarhouse assez complexe (plusieurs
centaines de tables, d'index, et plusieurs milliers de traitements).

Les tables sont définis bien souvent avec tout un ensemble d'index.

Pour des raisons d'optimisation lors de modification de ces tables


(delete,
insert, update) je me dis que peut etre un certain nombre d'index ne sont
jamais utilisé dans une clause "where" et il serait donc interessant de


les
supprimer définitivement.
Ainsi je gagnerai du temps sur les insert, update, delete sans pour autant
dégrader les performances sur les select car ces index ne sont jamais
utilisés.

Ma question est donc de savoir s'il existe dans des vues système Oracle un
moyen simple de lister l'ensemble des index qui n'ont jamais été utilisé
dans une clause "where" d'une requête depuis le dernier démarrage de la
base. (Pour info la base n'est arrété qu'une fois par semaine pour faire
une sauvegarde à froid).

Une méthode TRES TRES TRES lourde et fastidieuse serait de faire un


explain
plan de chaque requête de l'application et de lister l'ensemble des index
utilisé mais vu le nombre de requêtes (plusieurs milliers il n'est pas
possible d'utiliser cette méthode).

Un,e autre méthode TRES TRES TRES lourde serait de supprimer un à un les
index et de voir après coup si l'application marche encore ... mais ça
prendrait des années à tout tester ...


Quelqu'un aurait il une solution "miracle" ?

Merci



en 8i, la seule solution est les explain plan
en 9i, on peut faire:
alter index index_name monitoring usage
à creuser ...
Avatar
Thierry Thomas
Mercredi 11 août 2004 à 04:54 GMT, Eric Latombe a écrit :

Quelqu'un aurait il une solution "miracle" ?



Je n'ai pas de solution miracle, et ça ne s'appliquera pas forcément,
mais j'ai déjà remarqué qu'il était intéressant de faire des requêtes
sur les vues du référentiel (USER_TAB_COLUMNS). Sur des bases
importantes qui ont déjà vécu, on arrive à trouver des colonnes indexées
en double (ex. sur une table on a un index sur la colonne A et un autre
sur les colonnes A et B), ou des index en double avec des PK / UK, ou
des index sur des colonnes de type date, alors qu'on sait que toutes les
requêtes se feront sur un TRUNC de la date, etc.

On peut aussi lister les colonnes indexées qui ne font pas partie d'une
contrainte FK / PK / UK, et les examiner attentivement, en regardant par
ex. la répartition des valeurs sur ces colonnes.
--
Th. Thomas.
Avatar
Igor Racic
C'est simple pour la version >= 9i.
Voilà l'exemple.

SQL> conn ind
Enter password:
Connected.
SQL> begin
2 for i in ( select index_name from user_indexes )
3 loop
4 execute immediate 'alter index '||i.index_name||' monitoring usage' ;
5 end loop;
6 end;
7 /

PL/SQL procedure successfully completed.

SQL> select * from v$object_usage where used='NO';

INDEX_NAME TABLE_NAME MON USE
START_MONITORING END_MONITORING
------------------------------ ------------------------------ --- ---
------------------- -------------------
TI T YES NO
08/11/2004 21:34:19




Igor





Eric Latombe wrote:
Hello,

J'ai une application de type datawarhouse assez complexe (plusieurs
centaines de tables, d'index, et plusieurs milliers de traitements).

Les tables sont définis bien souvent avec tout un ensemble d'index.

Pour des raisons d'optimisation lors de modification de ces tables (delete,
insert, update) je me dis que peut etre un certain nombre d'index ne sont
jamais utilisé dans une clause "where" et il serait donc interessant de les
supprimer définitivement.
Ainsi je gagnerai du temps sur les insert, update, delete sans pour autant
dégrader les performances sur les select car ces index ne sont jamais
utilisés.

Ma question est donc de savoir s'il existe dans des vues système Oracle un
moyen simple de lister l'ensemble des index qui n'ont jamais été utilisé
dans une clause "where" d'une requête depuis le dernier démarrage de la
base. (Pour info la base n'est arrété qu'une fois par semaine pour faire
une sauvegarde à froid).

Une méthode TRES TRES TRES lourde et fastidieuse serait de faire un explain
plan de chaque requête de l'application et de lister l'ensemble des index
utilisé mais vu le nombre de requêtes (plusieurs milliers il n'est pas
possible d'utiliser cette méthode).

Un,e autre méthode TRES TRES TRES lourde serait de supprimer un à un les
index et de voir après coup si l'application marche encore ... mais ça
prendrait des années à tout tester ...


Quelqu'un aurait il une solution "miracle" ?

Merci