1. #161
    Modérateur

    Homme Profil pro
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    7 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en décisionnel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2008
    Messages : 7 427
    Points : 15 703
    Points
    15 703

    Par défaut

    Citation Envoyé par StringBuilder Voir le message
    Je vois pas avec Oracle comment tu fais plus rapide et plus simple avec :old et :new
    Je ne sais pas si c'est le meilleur exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    when (:old.Artikelbez <> :new.Artikelbez)
    begin
        update CRM_04
           set Text = :new.Artikelbez
         where id   = :old.id_04;
    end;
    /

  2. #162
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    février 2010
    Messages
    2 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2010
    Messages : 2 985
    Points : 4 922
    Points
    4 922
    Billets dans le blog
    1

    Par défaut

    Plus simple, je veux bien.

    Maintenant, tu mets à jour 5000 lignes en bloc, je doute que ce soit plus rapide :o
    On ne jouit bien que de ce qu’on partage.

  3. #163
    Modérateur

    Homme Profil pro
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    7 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en décisionnel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2008
    Messages : 7 427
    Points : 15 703
    Points
    15 703

    Par défaut

    Non, pas de soucis de performance même avec le trigger FOR EACH ROW (désolé pour la digression PL/SQL) :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    create table crm_04
    ( id    integer       not null primary key
    , text  varchar2(500)     null
    );
     
    -- table CRM_04 créé(e).
     
    create table article
    ( id           integer       not null primary key
    , id_04        integer           null
    , Artikelbez   varchar2(500)     null
    );
     
    -- table ARTICLE créé(e).
     
    insert into crm_04 (id, text)
        select level, sys.dbms_random.string('a', 200)
          from dual
    connect by level <= 1000000;
     
    -- 1*000*000 lignes inséré.
    -- Elapsed: 00:02:53.618
     
    commit;
     
    -- validé (commit).
     
    insert into article (id, id_04, Artikelbez)
        select level
             , floor(sys.dbms_random.value(1, 1000000))
             , sys.dbms_random.string('a', 200)
          from dual
    connect by level <= 1000000;
     
    -- 1*000*000 lignes inséré.
    -- Elapsed: 00:02:57.179
     
    commit;
     
    -- validé (commit).
     
    -- Temps de référence de la mise à jour simple 
     
    update article
       set artikelbez = sys.dbms_random.string('a', 300)
     where id between 1 and 100000;
     
    -- 100*000 lignes mis à jour.
    -- Elapsed: 00:00:27.316
     
    commit;
     
    -- validé (commit).
     
    -- Création du trigger FOR EACH ROW
     
    create or replace trigger tgbu_article
    before update on article
    for each row
    when (old.Artikelbez <> new.Artikelbez)
    begin
        update crm_04
           set Text = :new.Artikelbez
         where id   = :new.id_04;
    end;
    /
     
    -- Elément TRIGGER TGBU_ARTICLE compilé
     
    update article
       set artikelbez = sys.dbms_random.string('a', 300)
     where id between 100001 and 200000;
     
    -- 100*000 lignes mis à jour.
    -- Elapsed: 00:00:32.720
     
    -- 5 secondes de plus que le temps de référence, on va dire 15 à 20%
     
    commit;
     
    -- validé (commit).
     
     
    -- Suppression du trigger FOR EACH ROW et simulation de la mise à jour ensembliste avec deux requêtes
     
    drop trigger tgbu_article;
     
    -- trigger TGBU_ARTICLE supprimé(e).
     
    update article
       set artikelbez = sys.dbms_random.string('a', 300)
     where id between 200001 and 300000;
     
    -- 100*000 lignes mis à jour.
    -- Elapsed: 00:00:27.651
     
     merge into crm_04 tgt
     using (  select id_04
                   , max(id) as id
                   , max(artikelbez) keep(dense_rank first order by id desc) as artikelbez
                from article
            group by id_04 ) src
        on (src.id_04    = tgt.id
       and  src.id between 200001 and 300000)
      when matched then update
       set tgt.text = src.Artikelbez;
     
    -- 47*213 lignes fusionné.
    -- Elapsed: 00:00:03.051
     
    commit;
     
    -- validé (commit).
    J'extrait la conclusion de ce test très simple.
    Mise à jour de 100k lignes dans 1M : 27,5 secondes.
    Avec un trigger for each row : 32,7 secondes
    Sans trigger avec requête ensemblise : 30,7 secondes.

    Le surcoût du trigger for each row sur ce test est inférieur à 10%, sachant que les triggers n'existent pas pour gérer ce genre de volume.

  4. #164
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    février 2010
    Messages
    2 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2010
    Messages : 2 985
    Points : 4 922
    Points
    4 922
    Billets dans le blog
    1

    Par défaut

    Mouais, enfin entre un update qui porte sur 100k lignes et 100k update d'une seule ligne, je pense quand même que "en conditions réelles", la balance penche quand même du côté du gros update
    On ne jouit bien que de ce qu’on partage.

  5. #165
    Membre éprouvé

    Profil pro
    Inscrit en
    juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 448
    Points : 1 199
    Points
    1 199

    Par défaut

    Citation Envoyé par StringBuilder Voir le message
    Peut-être avec une CTE ?
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    with cte as
    (
       SELECT B.*, ROW_NUMBER() OVER (PARTITION BY B.INDEXEDCOLUMN ORDER BY B.ORD) AS NB
        FROM B
    )
    SELECT
    *
    FROM A
    INNER JOIN CTE ON (
        CTE.INDEXEDCOLUMN  = A.XXX
        AND
        CTE.NB = 1
    )
    WHERE A.NAME LIKE 'Blah%'
    Qu'est-ce que la CTE change ?
    Most Valued Pas mvp

  6. #166
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    février 2010
    Messages
    2 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2010
    Messages : 2 985
    Points : 4 922
    Points
    4 922
    Billets dans le blog
    1

    Par défaut

    C'étais juste une proposition d'écriture alternative
    On ne jouit bien que de ce qu’on partage.

Discussions similaires

  1. Qu'est ce que cela veux dire un "code propre" selon-vous ?
    Par kagura dans le forum Général Conception Web
    Réponses: 45
    Dernier message: 09/02/2016, 14h22
  2. Quel est selon-vous le système idéal à la maison ?
    Par Community Management dans le forum Linux
    Réponses: 77
    Dernier message: 19/11/2015, 09h24
  3. Réponses: 51
    Dernier message: 15/03/2011, 15h51
  4. Quel est le meilleur générateur d'états selon vous ?
    Par Marc Lussac dans le forum Outils de restitution et d'analyse
    Réponses: 80
    Dernier message: 18/05/2010, 16h43
  5. Quel est selon vous le meilleur AV du marché ?
    Par lavazavio dans le forum Sécurité
    Réponses: 6
    Dernier message: 10/10/2005, 08h30

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