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

PL/SQL Oracle Discussion :

Trigger: contrôle des doublons à l'insertion


Sujet :

PL/SQL 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 Trigger: contrôle des doublons à l'insertion
    Bonjour,

    J'aurai besoin de l'avis d'experts concernant la mise en place de contrôles de doublons. Je m'explique:

    - je reçois des fichiers plats via FTP avec des expéditions
    - Ces expéditions sont remontées dans une table temporaire par bloc de 15000 via sqlloader selon certaines règles (on intègre que les expéditions des clients existants dans la base)
    - ensuite on copie cette table temporaire dans la
    table finale.

    Sauf qu'aujourd'hui il n'y a pas de contrôle pour empécher d'éventuels doublons et cela devient très problématique.

    Il faudrait donc que je rajoute dans le trigger d'insertion dans la table finale un contrôle. Il ya 2 solutions, pour une expédition donnée (identifiée
    par un numéro d'expédition + le numéro de client)

    - soit je supprime systématiquement les expéditions avec le meme identifiant avant l'insertion (si y'en a pas ça supprimera rien)
    - soit je teste si l'expédition existe déja (table avec tres gros volume) si oui je supprime et j'insère ou j'update

    Quelle serait selon vous le moins couteux niveau
    performance?

    Merci d'avance, je dois agir vite, et nous n'avons pas d'expert Oracle

    Serveur Unix, Oracle 9i

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    A mon avis, un MERGE marchera bien.
    Faudra rajouter un index unique sur ton (numéro d'expédition + le numéro de client)

  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
    Citation Envoyé par McM
    A mon avis, un MERGE marchera bien.
    Faudra rajouter un index unique sur ton (numéro d'expédition + le numéro de client)
    Au niveau des index, pour cette table j'en ai déja 7 (qui concernent chacun 1 ou plusieurs champs combinés). Est-ce logique? (la base a été mise en place bien avant mon arrivée, et mes compétences d'admin oracle sont assez limitées)

    Je viens de regarder la FAQ pour le merge, ça m'a l'air de bien correspondre a ce que je veux faire. Cependant par rapport a un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    insert into EXPED  (...)
    select  ...  from TMP_EXPED
    ;
    (c'est ce qui est en place)
    qu'est-ce que ça donne niveau performance?

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    une autre solution consiste à ajouter une contrainte d'unicité et de gérer l'exception DUP_VAL_ON_INDEX

    Par ailleurs, une table externe en lieu et place de SQL*Loader + insert serait probablement plus performant

  5. #5
    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
    Citation Envoyé par orafrance
    une autre solution consiste à ajouter une contrainte d'unicité et de gérer l'exception DUP_VAL_ON_INDEX

    Par ailleurs, une table externe en lieu et place de SQL*Loader + insert serait probablement plus performant

    Concernant la contrainte d'unicité tu le fais au niveau de l'index?
    ça va pas etre long de créer un index sur une table de plusieurs dizaines de millions de lignes?

    Que veux-tu dire par table externe?

  6. #6
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Tu peux créer une contrainte avec l'option NOVALIDATE pour éviter de vérifier la contrainte sur les lignes qui existe déjà : http://oracle.developpez.com/guide/a...disable_clause

    pour la table externe : http://oracle.developpez.com/guide/a...age=Chap1#L1.5
    C'est tout simplement une table basée sur un fichier

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/05/2014, 14h39
  2. Trigger: contrôle des doublons à l'insertion
    Par petitediablesse dans le forum PL/SQL
    Réponses: 11
    Dernier message: 27/09/2013, 14h36
  3. [XL-2003] Contrôle des doublons sur plusieurs feuilles, puis suppression
    Par DeathLighT dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 04/03/2013, 12h14
  4. contrôle des doublons sur plusieurs champs
    Par christy1 dans le forum Modélisation
    Réponses: 3
    Dernier message: 09/12/2011, 14h13
  5. [MySQL] Contrôle des doublons
    Par samjung dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 16/11/2005, 19h54

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