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 :

Quelle est le meilleur moyen de créer une clé primaire artificielle dans un contexte datawarehouse ?


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 18
    Points : 18
    Points
    18
    Par défaut Quelle est le meilleur moyen de créer une clé primaire artificielle dans un contexte datawarehouse ?
    Bonjour,

    Je me trouve dans un contexte datawarehouse et je travail avec Oracle comme BDD. Mon problème est le suivant :

    J'ai une table de dimension "clients" qui a une clé primaire composée de deux colonnes (une clé composite). Mon but est de créer une clé primaire artificielle (une surrogate key) de type Number dans cette table. Un entier qui s'incrémente à chaque INSERT serait parfait pour cette clé.

    Une des solutions que j'ai trouvée c'est de créer une séquence, et ensuite créer un déclencheur dans ma table clients pour affecter la valeur nextval() de la séquence à la clé artificielle à de chaque INSERT sur la table. Mes craintes sont les suivantes :
    - Est ce que ça se fait de créer un déclencheur dans une table de dimension s'alimentant en batch ? cela ne risque-t-il pas de rendre la mise à jour de la table excessivement lent ?
    - J'ai entendu pas mal de mauvaises choses pas rassurantes sur les séquences oracle : la séquence redémarre à zéro de façon inattendue, valeurs imprévisibles, etc. Est-ce vrai ? Cela mettrai réellement en question la viabilité de cette technique dans le temps
    - Enfin, existe-t-il un procédé plus optimal de réaliser ce que j'ai décrit ?

    Merci pour vos réponses.

  2. #2
    Expert confirmé
    Avatar de doc malkovich
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2008
    Messages
    1 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 884
    Points : 4 285
    Points
    4 285
    Billets dans le blog
    1
    Par défaut
    Hello,

    J'ai déjà pratiqué de cette manière pour un client, il n'y a pas de problème.
    C'est évidemment plus lent mais pour des dimensions à faible volumétrie ce n'est pas grave.

    Les points à savoir :
    • la séquence s'incrémente même en cas de rollback, ce qui peut donner des trous dans la série ...
    • la séquence peut être définie avec un cache (je ne sais plus comment ça s'appelle exactement), l'idée est de récupérer plusieurs valeurs dès le 1er appel pour aller plus vite. Dans ce cas on a aussi des trous ...
    • les triggers d'insert sont désactivés pour un chargement en mode direct
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  3. #3
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Points : 1 359
    Points
    1 359
    Par défaut
    Citation Envoyé par doc malkovich Voir le message
    [*]les triggers d'insert sont désactivés pour un chargement en mode direct [/LIST]
    C'est l'inverse qui a lieu. C'est le mode direct ou plus explicitement le mode en insert /*+ append */ qui est désactivé (ou silencieusement ignoré) en cas de présence de triggers ou de contraintes d'intégrités étrangères (Foreign Key).

    Ne pas confondre avec le chargement de données utilisant le sqlLoader en mode direct path = true qui, lui, effectivement non seulement ignore les triggers mais également les Foreign keys, les contraintes d'unicités et disable aussi les indexes uniques. Ne soyez pas étonné de voir des doublons dans votre table possédant une clé primaire mais qui a été chargée via sqlLoader en mode direct path = true

    Cela fait un moment que je n'ai plus testé cela, mais je ne pense pas qu'Oracle ait changé quelque chose à ce niveau.
    Bien Respectueusement
    www.hourim.wordpress.com

    "Ce qui se conçoit bien s'énonce clairement"

  4. #4
    Expert confirmé
    Avatar de doc malkovich
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2008
    Messages
    1 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 884
    Points : 4 285
    Points
    4 285
    Billets dans le blog
    1
    Par défaut
    Au temps pour moi, je me suis mal exprimé ...
    Oui en effet, c'est sqlloader qui va ignorer tous les triggers en direct path, dont ceux d'insert.
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  5. #5
    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 sequence est la bonne solution pour générer une clé numérique unique. Le mieux est de l'utiliser dans l'insert. Lorsqu'on ne peut pas, on peut utiliser un trigger jusqu'en 11g. En 12c on peut utiliser la sequence en déclarant la valeur par défaut de la colonne. En 12c on peut même créer la sequence de manière implicite avec les colonnes auto-incrémentées.
    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

Discussions similaires

  1. Quelle est la meilleure manière de créer une url à partir du GET
    Par oliviercuyp dans le forum Zend Framework
    Réponses: 7
    Dernier message: 25/11/2008, 11h58
  2. Quelle est la meilleure solution pour créer des Web Services?
    Par Flipmode dans le forum Services Web
    Réponses: 1
    Dernier message: 26/04/2007, 15h12
  3. Réponses: 2
    Dernier message: 19/03/2007, 16h41
  4. Réponses: 3
    Dernier message: 09/05/2006, 15h16
  5. [MySQL] Quel est le meilleur moyen de stocker une date/heure ?
    Par MiJack dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 31/07/2004, 12h19

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