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 ...
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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 ...
"Eric Latombe" <eric.latombe@wanadoo.fr> a écrit dans le message de news:
4119a68f$0$9763$636a15ce@news.free.fr...
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 ...
"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 ...
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.
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.
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.
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
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 ...
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 ...