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 :

Question de performance trigger/ PL [11g]


Sujet :

PL/SQL Oracle

  1. #1
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut Question de performance trigger/ PL
    Bonjour
    Je dois réaliser quelques triggers et je me pose un question sur la forme et la performance

    syntaxe 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    CREATE OR REPLACE TRIGGER MonTrigger
    AFTER INSERT OR UPDATE
    ON com_e
    FOR EACH ROW  -- pour chaque ligne parceque ce n'est pas implicite !
    DECLARE
      vIdSuivi NUMBER := -1;
    BEGIN  
    -- si mon select ne trouve rien, alors, je fais la suite, sinon dodo !
      FOR crs IN (SELECT idsuivi FROM MaTable WHERE flowtype = 'MonFlux' AND key = :new.NUMCOMMANDE AND stateid = 0)
      LOOP
        vIdSuivi := crs.idsuivi;
      END LOOP;
      IF vIdSuivi = -1 THEN
        INSERT INTO MaTable(idsuivi,flowtype,key,company,stateid,process) VALUES(MaSequence.nextval,'MonFlux',:new.NUMCOMMANDE,'',0,'Toto');
      END IF;
    END ;
    syntaxe2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE OR REPLACE TRIGGER MonTrigger
    AFTER INSERT OR UPDATE
    ON com_e
    FOR EACH ROW  -- pour chaque ligne parceque ce n'est pas implicite !
    DECLARE
      vIdSuivi NUMBER := -1;
    BEGIN  
    -- si mon select ne trouve rien, alors, je fais la suite, sinon dodo !
      SELECT idsuivi INTO vIdSuivi FROM MaTable WHERE flowtype = 'MonFlux' AND key = :new.NUMCOMMANDE AND stateid = 0;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        INSERT INTO MaTable(idsuivi,flowtype,key,company,stateid,process) VALUES(MaSequence.nextval,'MonFlux',:new.NUMCOMMANDE,'',0,'Toto');
    END ;
    Quelle syntaxe choisir ?
    Ou une autre ???
    Pour info mon sélect ne renvoie qu'une ligne unique.

    Merci d'avance

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    L'idée c'est de faire directement l'insertion dans MaTable sans tester l'existence de la ligne au préalable, et de gérer l'exception si la ligne existe déjà.

    Par contre, si je comprends la logique, quand vous faites un insert dans COM_E vous insérer une ligne dans MaTable, mais si vous faites un update, la ligne existant déjà vous n'allez rien faire.
    Dans ce cas un déclencheur after insert doit être suffisant.

  3. #3
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Citation Envoyé par Waldar Voir le message
    L'idée c'est de faire directement l'insertion dans MaTable sans tester l'existence de la ligne au préalable, et de gérer l'exception si la ligne existe déjà.
    Non, Cette ligne ne doit être insérée que si elle n'existe pas, il s'agit d'un ordre d'export de données qui sera traité par un batch.
    =>Si une ligne pour monflux et maclef existe déjà en état à traiter (stateid = 0), on ne remet pas un deuxième ordre, les données de com_e ont été créées/modifiées et n'ont pas encore été exportées.
    =>S'il existe en état traité, etc. (stateid != 0) on remet un nouvel ordre : les données de la table con_e ont été modifiée et doivent être exportées.

    Citation Envoyé par Waldar Voir le message
    Par contre, si je comprends la logique, quand vous faites un insert dans COM_E vous insérer une ligne dans MaTable, mais si vous faites un update, la ligne existant déjà vous n'allez rien faire.
    Dans ce cas un déclencheur after insert doit être suffisant.
    Comme dit plus haut, la ligne insérée aura changée de stateid et poura être insérée de nouveau.

    Dans tous les cas une ligne dans matable avec un FlowType et une Key donnée ne peut exister qu'une seule fois en état stateid = 0, par contre elle existera de nombreuses fois en stateid > 1.

  4. #4
    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
    D’une manière générale l’algorithme qui ne gère pas d’exception est plus rapide, parce que gérer des exceptions ajout un coût supplémentaire. Mais cela dépende vraiment de la proportion des cases où l’exception sera levée. C’est-à-dire si l’exception arrivé que dans 2% des cas sur 100 000 exécutions il sera assez difficile de voir la différence. Et pour qu’une différence y’en a il faut de dizaines des milliers d’exécutions.
    Tout ça c’est juste pour dire que sauf situation exceptionnelle il y a des autres chats à fouetter dans la quête de la performance.

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

Discussions similaires

  1. [WPF] Encore les images - question de performances
    Par BruceWayne dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 13/06/2007, 13h23
  2. question de performance : transtypage ou pas ?
    Par brice01 dans le forum Développement 2D, 3D et Jeux
    Réponses: 6
    Dernier message: 19/03/2007, 16h04
  3. [question de performance]
    Par viny dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 18/08/2005, 22h48
  4. question general sur triggers (liaison avec VB)
    Par DaxTaz dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/07/2004, 15h57
  5. Question de performance
    Par davidx dans le forum Requêtes
    Réponses: 2
    Dernier message: 27/11/2003, 22h55

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