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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 56
    Points : 17
    Points
    17
    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 é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
    A mon avis, un MERGE marchera bien.
    Faudra rajouter un index unique sur ton (numéro d'expédition + le numéro de client)
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 56
    Points : 17
    Points
    17
    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 sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    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 à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 56
    Points : 17
    Points
    17
    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 sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    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

  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
    Pour gérer l'exception DUP_VAL_ON_INDEX, t'es obligé d'insérer ligne par ligne.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 56
    Points : 17
    Points
    17
    Par défaut
    Donc l'idéal serait d'ajouter une contrainte d'unicité en NOVALIDATE et de faire un MERGE pour insérer dans la table finale?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 14
    Points : 15
    Points
    15
    Par défaut Nb de lignes traitées par l'update
    Une autre solution, plus performante a mon sens que de traiter les exceptions liées aux violations de contraintes est de commencer par un update puis un insert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Update EXPE set champ1 = var1 where num_cli = x and num_exp = y ;
    If sql%rowcount = 0 Then
    -- si l'instruction update n'a impacté aucune ligne
    Insert into EXPE ... ;
    End If ;

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    c'est ce que fait le MERGE en principe

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par McM
    Pour gérer l'exception DUP_VAL_ON_INDEX, t'es obligé d'insérer ligne par ligne.
    tu peux passer par un BULK pour améliorer les perfs

  12. #12
    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

    Tout ceci est regroupé dans le ... MERGE
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 56
    Points : 17
    Points
    17
    Par défaut
    Merci pour vos réponses je vais essayer de mettre ça en place d'ici la fin de semaine!

  14. #14
    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
    Flute, grillé...

    Sinon, Orafrance comment tu fais avec un BULK ?
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par McM
    Flute, grillé...

    Sinon, Orafrance comment tu fais avec un BULK ?
    http://sheikyerbouti.developpez.com/...age=Chap5#L5.5

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 56
    Points : 17
    Points
    17
    Par défaut
    Bon y'a un truc que je pige pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ALTER TABLE EXPED ADD CONSTRAINT C_EXPED_UNIQUE UNIQUE (....) ENABLE NOVALIDATE
                                     *
    ERROR at line 1:
    ORA-02299: cannot validate (BASE.C_EXPED_UNIQUE) - duplicate keys found
    Le novalidate n'est pas censé justement ignorer l'existant?

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    oui, en effet.

    En fait, quand elle est activée (ENABLE) la contrainte est forcément vérifiée. L'idéal est donc de supprimer les doublons avant d'activre la contrainte.

    Pour répondre à ton besoin tu dois utiliser l'option deferrable initially deferred : http://download.oracle.com/docs/cd/B...3a.htm#1002617

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 56
    Points : 17
    Points
    17
    Par défaut
    Bon je reviens à la charge car je bosse ce week-end. Je ne sais pas si j'aurai beaucoup de réponses un dimanche

    J'ai décidé d'effectuer une purge des doublons pour libérer de l'espace disque, ma table contient 201 000 000 de lignes. j'en ai supprimé 2millions pour l'instant et je me rend compte que l'occupation de mon tablespace n'a pas évolué dans ma console oracle, il est strictement le meme au Mo près. Une idée du pourquoi du comment?

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 56
    Points : 17
    Points
    17
    Par défaut
    Bon après 8.500.000 lignes en moins l'occupation n'a toujours pas bougé d'un poil... Si quelqu'un a une explication je suis preneur, car là je sèche...

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    un DELETE ne fait pas redescendre la HWM donc t'as pas gagné d'espace disque... il faut reconstruire ton tablespace en déplaçant tous les objets dans un autre tablespace pour gagner l'espace disque.

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