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 :

Primary Key et contrainte Unique ET index Unique : double vérification? [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 Primary Key et contrainte Unique ET index Unique : double vérification?
    Bonjour,

    J'ai constaté que quand on crée une contrainte unique ou une PK dans une table, Oracle crée automatiquement un index mais que cet index est de type UNIQUE :
    https://docs.oracle.com/cd/B28359_01...indexes003.htm
    "Oracle Database enforces a UNIQUE key or PRIMARY KEY integrity constraint on a table by creating a unique index on the unique key or primary key."

    Ma question est : est-ce que pendant un INSERT ou un UPDATE, la contrainte d'unicité est testée deux fois : à la fois dans la table via les contraintes d'intégrité mais aussi lors de la mise à jour de l'index?
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Un bon SGBDR optimise tous les traitements internes. Le but d'un index est d'accélérer les recherches. En posant une PK, un index UNIQUE est créé. Deux solutions s'offrent à l'optimiseur pour vérifier l'unicité d'une nouvelle entrée :
    • bloquer la table en mode exclusif, la parcourir entièrement pour vérifier que la valeur que l'on veut insérer n'existe pas déjà, insérer la nouvelle ligne, débloquer la table.
    • rechercher la valeur que l'on veut insérer dans l'index, bloquer la valeur pour l'insertion de la ligne, insérer la nouvelle ligne, débloquer la ligne.


    Je te laisse deviner ce que l'optimiseur choisira !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  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
    Salut SQLpro : je penche pour la deuxième approche, l'utilisation de l'index qui doit être quand même bien plus rapide qu'un Full table scan.

    Je ne comprends pas "bloquer la valeur pour l'insertion de la ligne" : Oracle s'assure par un mécanisme interne qu'aucune autre transaction ne va insérer la même valeur?

    En tout cas merci pour la réponse, je ne m'étais jamais demandé comment Oracle vérifiait l'unicité d'une colonne avant.
    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,
    Un index (pas forcement unique) est nécessaire pour vérifier la contrainte d'intégrité. C'est pour cela qu'il est créé automatiquement s'il existe pas déjà un index qui commence par les colonnes uniques. Un index unique est un peu plus performant qu'un index non-unique, d'où le choix. Il n'y a pas de double vérification: seulement la déclaration d'une contrainte, et la structure physique qui permet de la vérifier.
    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
    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
    Je vous remercie pour vos réponses car je ne me souviens pas avoir lu dans un bouquin qu'on utilisait les index pour valider les contraintes d'unicité; j'aurai appris quelque chose de vraiment intéressant
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Ikebukuro Voir le message
    Je vous remercie pour vos réponses car je ne me souviens pas avoir lu dans un bouquin qu'on utilisait les index pour valider les contraintes d'unicité; j'aurai appris quelque chose de vraiment intéressant
    C'est normal, car vous avez sans doute appris les bases de données d'un point de vue logique. D'un point de vue logique, la notion d'index, tout comme la notion de "storage" n'existe pas. Il faut descendre au niveau physique pour y trouver tout cela et c'est de la responsabilité du DBA, pas du développeur.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par pachot Voir le message
    Bonjour,
    Un index (pas forcement unique) est nécessaire pour vérifier la contrainte d'intégrité. ...
    Désolé mais je ne suis pas d'accord avec toi, car aucun index n'est nécessaire pour vérifier la moindre unicité (contrainte d'intégrité dont tu parles)...

    C'est d'ailleurs ce que je démontre dans mon post : http://www.developpez.net/forums/d15...n/#post8694027

    Sauf que la différence entre pas d'index pour vérifier une clef primaire et un index pour cela étant tellement énorme que tous les SGBDR (et oracle en fait bien sûr partie) posent un index sous-jacent lorsque de la création des contraintes PRIMARY KEY et UNIQUE, ce qui présente le double avantage :
    • d'aller immensément plus vite
    • de permettre une meilleure concurrence d'accès


    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Ikebukuro Voir le message
    Je ne comprends pas "bloquer la valeur pour l'insertion de la ligne" : Oracle s'assure par un mécanisme interne qu'aucune autre transaction ne va insérer la même valeur?
    Oui, car si une autre personne veut insérer la même valeur au même moment, il faut la rejeter. Le but d'un verrou (le fameux mécanisme interne) est d'obliger les accès concurrents à attendre avant de pouvoir faire.
    Ainsi, un utilisateur qui voudrait insérer la même valeur se verrait obligé d'attendre jusqu'à ce que la transaction d'insertion qui le fait patienter, soit validée par un COMMIT. Dès lors il peut accéder à cet endroit de la table et constater que la valeur existe déjà et sera bien entendu refoulé par un "viol" de contrainte.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    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
    Citation Envoyé par SQLpro Voir le message
    ... aucun index n'est nécessaire pour vérifier la moindre unicité ...
    Je parle dans le contexte d'Oracle ici. Ce n'est pas nécessairement une question de performance car sinon la même chose serait faite pour une foreign key: lors d'un delete sur une table référencée, il y a soit accès par index, soit verrou (Share pas nécessairement exclusive) + full table scan. Pour une contrainte d'unicité il n'y a pas le choix: ce n'est implémenté que par index.
    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

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par pachot Voir le message
    ... Ce n'est pas nécessairement une question de performance car sinon la même chose serait faite pour une foreign key: lors d'un delete sur une table référencée, il y a soit accès par index, soit verrou (Share pas nécessairement exclusive) + full table scan. ...
    Là encore la nécessité d'indexer les FOREIGN KEY ou pas ne découle pas de la pose de FK, mais plus simplement du fait qu'il est inutile de poser un index ou il y en a déjà un.
    Par essence il est important d'indexer toutes les FK, sans chercher à comprendre. Cela ne fait pas de mal. Cependant certaines FK sont déjà "naturellement" indexées... d’où la position d'une majorité de SGBDR qui n'indexe jamais les FK de manière automatique (Oracle, comme SQL Server par exemple). C'est le cas systématique de l'héritage et dans une moindre mesure de la table d'association (aussi appelée table de jointure) découlant d'une association plusieurs à plusieurs ou n-aire (n>2).
    Pour info, un seul SGBD soit disant relationnel, à pris le partit inverse : indexer toutes les FK... Devine lequel... Allez je t'aide :
    1) il est vendu par Oracle
    2) il est soit-disant libre (ce qui entre nous n'est pas vrai)
    3) son nom commence par "My..."

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  11. #11
    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 Frédéric,
    Là encore je ne parle que pour Oracle. Le fait qu'il est inutile de poser un index ou il y en a déjà un est géré pour les PK. Pour les FK c'est vraiment parce que ce n'est pas nécessaire pour l'implémentation qu'il n'y a pas d'index créé automatiquement. C'est un choix de performance à faire en fonction du volume, de la sélectivité, de la navigation parent->fils, et des opérations de delete sur le parent.
    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

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Pour info, Power AMC index toutes les FK sauf si elles sont "incluses" (il les signale et à nous de les corriger).

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. index unique vs index multiple
    Par LeHibou2 dans le forum Requêtes
    Réponses: 4
    Dernier message: 22/12/2012, 09h35
  2. SQL Server 2008 - index unique ou non unique ?
    Par drouhne dans le forum Administration
    Réponses: 3
    Dernier message: 12/10/2010, 15h45
  3. Réponses: 8
    Dernier message: 14/12/2009, 09h10
  4. Index unique a sens unique !
    Par dwown dans le forum Administration
    Réponses: 3
    Dernier message: 17/04/2009, 15h00
  5. PRIMARY KEY - UNIQUE - INDEX
    Par Thierry8 dans le forum Requêtes
    Réponses: 4
    Dernier message: 16/12/2005, 23h28

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