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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 93
    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 confirmé 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
    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
    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
    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 expérimenté 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
    Par défaut
    Je pense qu'en créant simplement des indexes, tu peux résoudre ton pb de lenteur.

  5. #5
    Membre émérite 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
    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 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
    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 confirmé 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
    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 ?

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