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 :

Une contrainte UNIQUE sur une colonne ne crée pas toujours un INDEX ? [11gR2]


Sujet :

Administration Oracle

  1. #1
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut Une contrainte UNIQUE sur une colonne ne crée pas toujours un INDEX ?
    Hello,

    Sur le site de ASK TOM je suis tombé sur ce message
    https://asktom.oracle.com/pls/asktom/f?p=100:11:2017491281965674:::11_QUESTION_ID:36858373078604

    "If you want a unique index in place, it is suggested you explicitly create it using CREATE UNIQUE INDEX. A primary key or unique constraint is not guaranteed to create a new index, nor is the index they create guaranteed to be a unique index. Therefore, if you desire a unique index to be created for query performance issues, you should explicitly create one. "

    Alors là je suis tombé sur le cul, est-ce que ce fait vous était connu ou non?
    Le reste de la page est assez long et parfois confus mais je n'avais jamais rencontré ce problème avant : chaque fois que je crée une table avec une contrainte unique, un index est créé (peu importe qu'il soit unique ou non car le test est fait au niveau de la MAJ des données). Idem si je fais un ALTER TABLE en ajoutant une contrainte PK ou UNIQUE.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  2. #2
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2015
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 49
    Points : 134
    Points
    134
    Par défaut
    Bonjour, d'apres mes lectures , je pense qu'un index sera créée tout de même pour les unique et primary constraint (sauf peut etre bug .. ). Je pense que meme si on suit la recommandation de Tom et la doc Oracle (en créant séparément un index explicitement ), il vaut mieut tout de même créer aussi la contrainte explicitement après , car l'index a lui seul ne fait pas une entree dans dba_constraints , et donc si vous avez des erreurs de type ORA-00001: unique constraint Nom_de_l'index violated >> confusion . J'espere que je n'enfreins pas les regles du forum en donnant un exemple issu d'un livre :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SQL> create unique index inv_uidx1 on inv(sku_id);
    SQL> insert into inv(sku_id) values (1);
    SQL> insert into inv(sku_id) values (1);
    Here’s the corresponding error message that is thrown:
    ERROR at line 1:
    ORA-00001: unique constraint (INV_MGMT.INV_UIDX1) violated
    If you’re asked to troubleshoot this issue, the first place you look is in DBA_CONSTRAINTS for a constraint named INV_UIDX1. However, there is no information:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select
    constraint_name
    from dba_constraints
    where constraint_name='INV_UIDX1';
    no rows selected
    The “no rows selected” message can be confusing: the error message thrown when you insert into the table indicates that a unique constraint has been violated, yet there is no information in the constraint-related data-dictionary views. In this situation, you have to look at DBA_INDEXES to view the details of the unique index that has been created.
    If you want to have information related to the constraint in the DBA/ALL/USER_CONSTRAINTS views, you can explicitly associate a constraint after the index has been created:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL> alter table inv add constraint inv_uidx1 unique(sku_id);
    In this situation, you can enable and disable the constraint independent of the index. However, because the index was created as unique, the index still enforces uniqueness regardless of whether the constraint has been disabled.
    When should you explicitly create a unique index versus creating a constraint and having Oracle automatically create the index? There are no hard and fast rules. I prefer to create a unique-key constraint and let Oracle automatically create the unique index, because then I get information in both the DBA/ALL/USER_CONSTRAINTS views and the DBA/ALL/USER_INDEXES views.
    But Oracle’s documentation recommends that if you have a scenario where you’re strictly using a unique constraint to improve query performance, it’s preferable to create only the unique index. This is fine. If you take this approach, just be aware that you may not find any information in the constraint-related data-dictionary views.




  3. #3
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Merci pour ce post qui me conforte dans mon opinion : il est préférable de créer une contrainte UNIQUE puis de vérifier que l'index a bien été créé.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  4. #4
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Une contrainte d'unicité a toujours besoin d'un index, mais il n'est pas forcément créé par la contrainte: un index existant qui commence par les colonnes de la contrainte d'unicité peut être utilisé par la contrainte. Même s'il a d'autres colonnes en plus. Et même s'il n'est pas unique.
    Cordialement,
    Franck.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  5. #5
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Les contraintes d’intégrité des données et le indexes sont deux animaux assez différents dans la ménagerie d’Oracle. Vous créez des indexes principalement pour des raisons de performance des requêtes, vous créez des contraintes pour garantir le respect des règles métier de votre application. Donc il n’est pas étonnant que la relation entre indexes et contraintes est un peu plus compliquée que l’apparence. De plus vous avez des exemples dans le lien que vous avez pointé.

  6. #6
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par fouedgr Voir le message
    ...Je pense que meme si on suit la recommandation de Tom et la doc Oracle (en créant séparément un index explicitement ), il vaut mieut tout de même créer aussi la contrainte explicitement après , car l'index a lui seul ne fait pas une entree dans dba_constraints , et donc si vous avez des erreurs de type ORA-00001: unique constraint Nom_de_l'index violated >> confusion . J'espere que je n'enfreins pas les regles du forum en donnant un exemple issu d'un livre :
    Vous avez certainement mal compris les propos de Tom Kyte ou vous n'avez probablement lu ce qu'il dit.

  7. #7
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2015
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 49
    Points : 134
    Points
    134
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Vous avez certainement mal compris les propos de Tom Kyte ou vous n'avez probablement lu ce qu'il dit.
    Bonjour mnitu,
    vous pouvez svp elaborer plus pourquoi vous dites cela : mon propos et l'exemple que j'ai donné était pour illustrer le cas de figure précis suivant : ne pas juste créer un index unique pour renforcer l’unicité de la colonne, mais toujours créer la contrainte explicitement.
    Est ce que vous pensez que cela est incorrect ?
    Cordialement,
    Foued

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

Discussions similaires

  1. Appliquer une contrainte unique sur une table existante
    Par zooffy dans le forum Développement
    Réponses: 3
    Dernier message: 24/05/2011, 15h28
  2. Une contrainte "unique" sur une clé primaire
    Par Invité1 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/04/2010, 21h11
  3. Réponses: 10
    Dernier message: 09/08/2007, 21h15
  4. [TopCased] contrainte {unique} sur une composition
    Par big x dans le forum Diagrammes de Classes
    Réponses: 3
    Dernier message: 03/07/2007, 14h04
  5. [SYBASE ASE] Rajouter une contrainte null sur une colonne
    Par Little_Goldo dans le forum Sybase
    Réponses: 1
    Dernier message: 09/02/2005, 10h48

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