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

Oracle Discussion :

foreign key non indexé


Sujet :

Oracle

  1. #1
    Membre actif Avatar de olivanto
    Responsable d'exploitation informatique
    Inscrit en
    Mars 2005
    Messages
    513
    Détails du profil
    Informations professionnelles :
    Activité : Responsable d'exploitation informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2005
    Messages : 513
    Points : 204
    Points
    204
    Par défaut foreign key non indexé
    bonjour,

    je suis sur une 9iR2, sous windows.

    Je cherche à trouver dans ma base les foreign key qui ne sont pas indexées (il y a une heure, je ne savais même pas que c'était possible...)

    Quelqu'un aurait'il une méhode ou une requête pour m'éviter de chercher table à table ?

    Intérêt : il semblerait qu'Oracle vérouille toute la table lors de mises à jour d'un champ en foreign key non indéxé !!

    Pour les verrous, combine de temps Oracle garde t'il un verrou avant d'annuler la transaction (cas d'un utilsiateur en modification qui sort brutalement !) ; peut'on régler ce "timer" ??

  2. #2
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Points : 2 998
    Points
    2 998
    Par défaut
    Bonjour,

    peut être une piste :
    la table ALL_CONSTRAINTS possède une colonne constraint_type qui losqu'elle vaut P concerne les Primary key, et losqu'elle vaut R correspond aux foreign key.

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Pour la liste des Foreign key non indexés, Asktom est ton ami.

    http://asktom.oracle.com/tkyte/unindex/index.html

    J'aime bien sa façon de faire en 1 select.
    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
    column columns format a20 word_wrapped
    column table_name format a30 word_wrapped
     
    select decode( b.table_name, NULL, '****', 'ok' ) Status, 
    	   a.table_name, a.columns, b.columns
    from 
    ( select substr(a.table_name,1,30) table_name, 
    		 substr(a.constraint_name,1,30) constraint_name, 
    	     max(decode(position, 1,     substr(column_name,1,30),NULL)) || 
    	     max(decode(position, 2,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(position, 3,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(position, 4,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(position, 5,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(position, 6,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(position, 7,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(position, 8,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(position, 9,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(position,10,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(position,11,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(position,12,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(position,13,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(position,14,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(position,15,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(position,16,', '||substr(column_name,1,30),NULL)) columns
        from user_cons_columns a, user_constraints b
       where a.constraint_name = b.constraint_name
         and b.constraint_type = 'R'
       group by substr(a.table_name,1,30), substr(a.constraint_name,1,30) ) a, 
    ( select substr(table_name,1,30) table_name, substr(index_name,1,30) index_name, 
    	     max(decode(column_position, 1,     substr(column_name,1,30),NULL)) || 
    	     max(decode(column_position, 2,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(column_position, 3,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(column_position, 4,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(column_position, 5,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(column_position, 6,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(column_position, 7,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(column_position, 8,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(column_position, 9,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(column_position,10,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(column_position,11,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(column_position,12,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(column_position,13,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(column_position,14,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(column_position,15,', '||substr(column_name,1,30),NULL)) || 
    	     max(decode(column_position,16,', '||substr(column_name,1,30),NULL)) columns
        from user_ind_columns 
       group by substr(table_name,1,30), substr(index_name,1,30) ) b
    where a.table_name = b.table_name (+)
      and b.columns (+) like a.columns || '%'
    /

  4. #4
    Membre actif Avatar de olivanto
    Responsable d'exploitation informatique
    Inscrit en
    Mars 2005
    Messages
    513
    Détails du profil
    Informations professionnelles :
    Activité : Responsable d'exploitation informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2005
    Messages : 513
    Points : 204
    Points
    204
    Par défaut
    merci pour l'éfficacité !

    Je m'aperçois que j'ai un petit paquet de FK non indéxées ; vous êtes dans le même cas que moi où je suis le seul boulet à avoir une base pourrie ?

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    En fait ça dépend pas mal de ta base de donnée.
    Un gars d'oracle (suite à des pb de perfs) nous a dit : Tous ces indexes sur les FK qui ne servent jamais : A supprimer. Trop d'indexes pourrissent aussi la base.

  6. #6
    Membre actif Avatar de olivanto
    Responsable d'exploitation informatique
    Inscrit en
    Mars 2005
    Messages
    513
    Détails du profil
    Informations professionnelles :
    Activité : Responsable d'exploitation informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2005
    Messages : 513
    Points : 204
    Points
    204
    Par défaut
    il a dit çà ??? je croyais qu'au contraire, c'était le fait de ne pas avoir d'index sur les FK qui générait des soucis (full scan, locks )

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Oui les locks... mais bon, si tu as 20 indexes sur ta table, chaque insertion/delete dans ta table va mettre à jour les indexes, les trier, etc...
    Faut voir si les références maitres sont souvent modifiées/supprimées

  8. #8
    Membre averti Avatar de Wurlitzer
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 469
    Points : 408
    Points
    408
    Par défaut
    Moi je suis partisan d'indexer toute les FK. (t inquiete pas t'es pas le seul a avoir une base pourrie). Les lock de niveau table sont tres pénalisant, je ne parle meme pas des éventuelles FK en delete cascade.

    Partir dans une analyse, référence souvent modifié ou non me parait complètement irréaliste ! !

    En plus c'est quoi la conclusion. Si la référence est souvent modifié c'est a dire que l'on a souvent besoin de l'index puisque qu'il y a souvent des problème avec les lock mais c'est aussi dans ce cas que l'on met souvent a jour les index et donc que c'est "couteux" en terme de perf.

    C'est mon avis et je le partage....

  9. #9
    Membre actif Avatar de olivanto
    Responsable d'exploitation informatique
    Inscrit en
    Mars 2005
    Messages
    513
    Détails du profil
    Informations professionnelles :
    Activité : Responsable d'exploitation informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2005
    Messages : 513
    Points : 204
    Points
    204
    Par défaut
    bon, donc la meilleure solution semble bien d'indexer les FK ; mais pourquoi Oracle n'indexe pas par défaut dans ce cas ??

  10. #10
    Membre averti Avatar de Wurlitzer
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 469
    Points : 408
    Points
    408
    Par défaut
    Grande question metaphysique à la quelle je n'ai toujousr pas trouvé de réponse

  11. #11
    Membre actif Avatar de olivanto
    Responsable d'exploitation informatique
    Inscrit en
    Mars 2005
    Messages
    513
    Détails du profil
    Informations professionnelles :
    Activité : Responsable d'exploitation informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2005
    Messages : 513
    Points : 204
    Points
    204
    Par défaut
    bon bon ... merci pour tout !

    Moi et ma base pourrie, on a du pain sur la planche ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Foreign Key et Index
    Par cfeltz dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 07/09/2007, 14h20
  2. foreign key et index
    Par sebos63 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 22/05/2007, 17h51
  3. Réponses: 7
    Dernier message: 21/01/2007, 12h12
  4. Liste des foreigns key non indexés
    Par soazig dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/05/2006, 17h50
  5. FOREIGN KEY et INDEX
    Par rsc dans le forum SQL
    Réponses: 2
    Dernier message: 19/07/2004, 09h06

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