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

SQL Oracle Discussion :

Optimisation requête delete


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 93
    Points : 41
    Points
    41
    Par défaut Optimisation requête delete
    Bonjour,

    J'ai la requête suivante qui dure plus de 20 heures, j'ai essayé d'optimiser par l'ajout de hint, c'est identique :
    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
    BEGIN
            LOOP
                    UPDATE purge_dealfront_intermediaires
                    SET     status ='1'
                    WHERE   status ='0'
                        AND rownum<=1000;
                    EXIT
            WHEN SQL%ROWCOUNT = 0;
                    COMMIT;
                    DELETE
                    FROM    eai_t_ver_dea_fo
                    WHERE   idt IN
                            (SELECT idt
                            FROM    purge_dealfront_intermediaires
                            WHERE   status = '1'
                            );
                    DELETE
                    FROM    eai_t_ver
                    WHERE   idt IN
                            (SELECT idt_ver
                            FROM    purge_dealfront_intermediaires
                            WHERE   status = '1'
                            );
                    DELETE
                    FROM    eai_t_tit
                    WHERE   idt IN
                            (SELECT idt_tit
                            FROM    purge_dealfront_intermediaires
                            WHERE   status = '1'
                            );
                    DELETE
                    FROM    eai_t_tie
                    WHERE   idt IN
                            (SELECT idt_tie_brk
                            FROM    purge_dealfront_intermediaires
                            WHERE   status = '1'
                            );
                    DELETE
                    FROM    eai_t_tie
                    WHERE   idt IN
                            (SELECT idt_tie_dep
                            FROM    purge_dealfront_intermediaires
                            WHERE   status = '1'
                            );
                    DELETE
                    FROM    eai_t_tie
                    WHERE   idt IN
                            (SELECT idt_tie_ctp
                            FROM    purge_dealfront_intermediaires
                            WHERE   status = '1'
                            );
                    DELETE
                    FROM    eai_t_tie
                    WHERE   idt IN
                            (SELECT idt_tie_cl
                            FROM    purge_dealfront_intermediaires
                            WHERE   status = '1'
                            );
                    DELETE
                    FROM    eai_t_trc
                    WHERE   idt_ver IN
                            (SELECT idt
                            FROM    purge_dealfront_intermediaires
                            WHERE   status = '1'
                            );
                    COMMIT;
                    UPDATE purge_dealfront_intermediaires
                    SET     status='2'
                    WHERE   status='1';
                    COMMIT;
            END LOOP;
    EXCEPTION
    WHEN OTHERS THEN
            ROLLBACK;
            INSERT
            INTO    EAI_T_LOG_PURGE VALUES
                    (
                            'deafo/drop_intermediaires.sql',
                            'ERROR'                        ,
                            'Drop failed'                  ,
                            'DF'                           ,
                            SYSDATE
                    );
            COMMIT;
            RAISE;
    END;
    /


    Auriez-vous une idée?

    Merci

    Bonne journée

    Bibi

  2. #2
    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
    Fait une trace SQL pour avoir plus d'informations sur ce qui se passe.
    Mais vue l'algorithme utilisé je pense qu'il doit y avoir des autres moyens à parvenir au même résultat.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Merci de formater le code à l'avenir : http://www.sqlinform.com/

    Tu peux expliquer le but du code parce qu'en effet, ça doit pouvoir se simplifier

  4. #4
    Membre actif Avatar de JerryMouse
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 215
    Points : 295
    Points
    295
    Par défaut
    Je pense qu'en créant simplement des indexes, tu peux résoudre ton pb de lenteur.

  5. #5
    Membre éclairé Avatar de philcero
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2007
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2007
    Messages : 528
    Points : 773
    Points
    773
    Par défaut
    Afin d'éviter les FULL SCAN sur les tables cibles : Est-ce que toutes tes colonnes de liaison (eai_t_*.idt) sont indexées ?

    Afin de n'utiliser que des indexs pour les tables filels : Est-ce que tu as des indexs multi-colonnes pour tes tables filles (status+idt_*) ?

    Petite optimisation : Tu peux également grouper tes 4 "DELETE FROM eai_t_tie ..." en utilisant un UNION des 4 tables filles.

  6. #6
    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
    Pourquoi passer par une boucle ?
    Pourquoi initialiser à 1 ?
    Il faut vérifier chaque requête pour voir les accès (Un index sur PURGE_DEALFRONT_INTERMEDIAIRES.STATUS

    Moi je ferais tous les updates
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DELETE	 EAI_T_VER_DEA_FO a
    		WHERE EXISTS 
    				(SELECT 1
    				FROM    PURGE_DEALFRONT_INTERMEDIAIRES b
    				WHERE   b.STATUS = '0'
    				AND 	b.idt = a.idt);
     
    ..
     
    UPDATE PURGE_DEALFRONT_INTERMEDIAIRES
    SET     STATUS='2'
    WHERE   STATUS='0';
     
    COMMIT;

  7. #7
    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
    Citation Envoyé par McM Voir le message
    Pourquoi passer par une boucle ?
    Pourquoi initialiser à 1 ?
    ...
    Ha, ha, parce que ils sont « prévoyants ». Et si il n’y pas assez d’espace de rollback ?

  8. #8
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 93
    Points : 41
    Points
    41
    Par défaut
    Exact, pas assez de rollback.
    Une idée?

  9. #9
    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
    Citation Envoyé par bibi92 Voir le message
    Une idée?
    Les index, les explain ?
    Ce sont des idées fournies, faut que tu travailles dessus.

  10. #10
    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
    Citation Envoyé par bibi92 Voir le message
    Exact, pas assez de rollback.
    Une idée?
    Et avez vous essayé d'estimer le besoin ou c'est comme ça au pif ?

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Février 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2006
    Messages : 139
    Points : 152
    Points
    152
    Par défaut
    Bonjour,

    Il n'y aurait pas des LOCKs?

    cdt

  12. #12
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 93
    Points : 41
    Points
    41
    Par défaut Tests
    Aucun lock, j'ai fait différents tests et les temps de réponse sont les mêmes.
    Peut-être, faut-il récréer les index?

    Merci

    Bonne fin de journée

  13. #13
    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
    Citation Envoyé par bibi92 Voir le message
    Aucun lock, j'ai fait différents tests et les temps de réponse sont les mêmes.
    Peut-être, faut-il récréer les index?

    Merci

    Bonne fin de journée
    Peut être il faut faire un TKPROF pour savoir ce qui se passe à la place d'essayer de devigner!

Discussions similaires

  1. Besoin d'aide pour optimiser requête SQL
    Par Keuf95 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/09/2005, 16h02
  2. Optimiser requête utilisant NOT IN
    Par Neilos dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/08/2005, 14h24
  3. optimisation requête
    Par alex2205 dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 09/02/2005, 14h15
  4. optimisation requête SQL!!! help!!
    Par anathem62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2004, 16h26
  5. [requête] DELETE + SELECT
    Par doohan dans le forum Requêtes
    Réponses: 6
    Dernier message: 07/07/2003, 12h27

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