IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration Oracle Discussion :

Non-utilisation d'index !


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 56
    Par défaut Non-utilisation d'index !
    Bonjour,

    Ce week-en j'ai effectué une maintenance Oracle sur une base, qui consistait à la recréation d'une table afin de supprimer des doublons. J'ai donc recréer la table, les indexes et les triggers.

    Et depuis j'ai des problèmes, une meme remquete exécutée sur la base de dev et de prod (qui ont les memes indexes) fonctionne bien sur la dev, mais mal sur la prod (non utilisation de certains indexes). J'ai bien les mêmes indexes, la requête est la même, mais l'explain me donne des résultats différents.

    Une idée??

  2. #2
    Membre Expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Par défaut
    Bonjour,

    Est ce que tu a lancé les stats sur les tables, les indexes, ... ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 56
    Par défaut
    Non, mais je ne l'ai jamais fait, je ne suis pas admin oracle à la base, à quelle occasion dois-je le faire?

    En fait le problème concerne des indexes sur des tables que je n'ai pas modifié, et je n'arrive pas à comprendre pourquoi, comment ces indexes ont pu etre impactés par la modification d'une table qui ne les concerne pas.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 56
    Par défaut
    Bon je n'arrive pas à comprendre, du coup le site dont je m'occupe est en rade, je vais devoir revenir à ma précédente sauvegarde en attendant de résoudre ce problème...

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    Salut,

    Je suis pas expert la dedans, mais tu peux essayer ce script pour reconstruire les index puis les stats sur ta base.
    Si tu ne veux pas traiter certains objets, tu peux configurer la variable 'nePasTraiter'.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    SET SERVEROUTPUT ON SIZE 100000
     
    DECLARE
     
    	v_dynam 	varchar2(200);
     
    	cursor index_cursor is
    	SELECT distinct owner, index_name, table_name from all_indexes ;
     
    	cursor table_cursor is
    	SELECT distinct owner, table_name FROM all_tables ;
     
    	nePasTraiter	varchar2(500);
     
    BEGIN
     
     
    execute immediate('ALTER SESSION SET NLS_SORT=BINARY');
     
    nePasTraiter := 'schema.table1, schema.table2';
     
     
    /***************** REBUILD *************************/
     
    	for c_row in index_cursor loop
     
    		if instr(nePasTraiter, c_row.owner || '.' || c_row.table_name) = 0 then
     
    			DBMS_OUTPUT.PUT_LINE(to_char(sysdate, 'HH24:MI:SS') || ': debut de reconstruction de ' || c_row.owner || '.' ||  c_row.index_name);
    			v_dynam := 'ALTER INDEX ' || c_row.owner || '.' ||  c_row.index_name || ' REBUILD COMPUTE STATISTICS';
    			execute immediate v_dynam;
     
    		end if;
    	end loop;
     
     
    /***************** STATISTIQUES OBJET PAR OBJET ****/
     
    	for c_row in table_cursor loop
     
    		if instr(nePasTraiter, c_row.owner || '.' || c_row.table_name) = 0 then
     
    			DBMS_OUTPUT.PUT_LINE(to_char(sysdate, 'HH24:MI:SS') || ': debut de traitement de ' || c_row.owner || '.' || c_row.table_name);	
     
    			v_dynam := 'BEGIN dbms_stats.gather_table_stats(ownname =>''' || c_row.owner || ''', tabname =>''' ||  c_row.table_name || ''' , estimate_percent => 20, method_opt => ''for all indexed columns size 128'', cascade => false ); END;';
    			execute immediate v_dynam;	
     
    		end if;
     
    	end loop;
     
    END;
     
    /

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 56
    Par défaut
    Merci pour ton aide, mais avant de me lancer la dedans (j'ai des tables avec plusieurs dizaines de millions d'enregistrements), j'aimerai être sûr que ça peut venir de là.

    Voici l'explain d'une meme requete sur mes serveurs de dev et prod (en tant normal ce n'est pas un select(*), c'est jsute pour que ce soit plus clair)

    En dev:





    En prod:


  7. #7
    Membre émérite Avatar de 13thFloor
    Homme Profil pro
    DBA Oracle freelance
    Inscrit en
    Janvier 2005
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle freelance

    Informations forums :
    Inscription : Janvier 2005
    Messages : 670
    Par défaut
    La reconstruction de la table (par move ou import je présume) a invalidé les curseurs qui accédaient à cette table => nouveau plan d'exécution.
    Si tu n'as pas recalculé les statistiques sur la table et ses index ,alors :
    en 9i : utilisation du mode d'optimisation rbo (basé sur la syntaxe de la requête)
    en 10g : utilisation du dynamic sampling (échantillonnage de statistiques)

    Le plus judicieux semble de calculer les stats sur la table :
    exec dbms_stats.gather_table_stats(ownname=> 'TON_USER', tabname=> 'NOM_DE_TABLE', partname=> NULL);
    exec dbms_stats.gather_index_stats(ownname=> 'TON_USER', indname=> 'NOM_D_INDEX', partname=> NULL);

    Vérifies si tu n'as pas des histogrammes sur certaines colonnes de la table (notamment celles qui font partie des index).

Discussions similaires

  1. Probleme de non utilisation de clé primaire/index
    Par saluts92 dans le forum Requêtes
    Réponses: 4
    Dernier message: 22/11/2011, 17h10
  2. Non utilisation de l'index
    Par JUSTIN Loïc dans le forum Requêtes
    Réponses: 15
    Dernier message: 11/06/2010, 15h55
  3. indexation non utilisée pour chaînes de caractères
    Par ctobini dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 11/02/2008, 09h43
  4. [Optimisation] index non utilisé et using temporary
    Par jp_rennes dans le forum Requêtes
    Réponses: 6
    Dernier message: 23/10/2006, 10h05
  5. [TUNING] pb non utilisation de l'index
    Par ruthene dans le forum Oracle
    Réponses: 10
    Dernier message: 13/04/2006, 17h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo