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

Requêtes MySQL Discussion :

Optimisation d'un delete [À faire]


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 934
    Par défaut Optimisation d'un delete
    Bonjour,

    Je n'ai plus les idées très claires sur une requête qui me paraissait (parait) simple et qui met des lustres à s'exécuter !!

    Soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    delete from _emailing_cleweb_attente 
    where action_cleunik=10003924 
    and intweb in (
        select intweb 
        from _emailing_cleweb 
        where action_cleunik = 10003924
    );
    Les descriptifs des fichiers respectifs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE TABLE  `_emailing_cleweb` (
     
      `action_cleunik` bigint(20) default NULL COMMENT 'Clé unique du emailing, de l''action',
     
      `intweb` bigint(20) default NULL COMMENT 'Clé unique de l''adresse courriel',
     
      KEY `action_cleunik` (`action_cleunik`),
     
      CONSTRAINT `contrainte_email_cle_action` FOREIGN KEY (`action_cleunik`) REFERENCES `_actions` (`action_cleunik`) ON DELETE CASCADE ON UPDATE CASCADE
     
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Adresses courriel utilisées dans un emailing (cleunik)';
    et
    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
     
     
    CREATE TABLE  `_emailing_cleweb_attente` (
     
      `action_cleunik` bigint(20) default NULL COMMENT 'Clé unique du emailing, de l''action',
     
      `intweb` bigint(20) default NULL COMMENT 'Clé unique de l''adresse courriel dans la file d''attente',
     
      UNIQUE KEY `emailing_liste_attente_cleunik` (`action_cleunik`,`intweb`),
     
      KEY `action_cleunik` (`action_cleunik`),
     
      CONSTRAINT `contrainte_email_cle_action_attente` FOREIGN KEY (`action_cleunik`) REFERENCES `_actions` (`action_cleunik`) ON DELETE CASCADE ON UPDATE CASCADE
     
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Adresses courriel dans la file d''attente d''un emailing (cleu';
    et le nombre d'enregistrements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select count(*) from _emailing_cleweb_attente;//8226
    select count(*) from _emailing_cleweb;//75297
    Je dois faire quelque chose à l'envers !!!!
    Ca fait plus d'un quart d'heure que la requête est lancée et toujours pas terminée !!!
    Quelqu'un pour m'ôter la bouse que je dois avoir dans les yeux ?

    D'avance, merci

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Essaie avec une jointure à la place du IN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DELETE FROM _emailing_cleweb_attente a
    INNER JOIN _emailing_cleweb c ON a.intweb = c.intweb
      AND a.action_cleunik = c.action_cleunik
    WHERE a.action_cleunik = 10003924
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre éprouvé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 934
    Par défaut
    Merci de te pencher sur mon problème mais j'ai une erreur :
    Erreur

    requête SQL:

    DELETE FROM _emailing_cleweb_attente a INNER JOIN _emailing_cleweb c ON a.intweb = c.intweb AND a.action_cleunik = c.action_cleunik WHERE a.action_cleunik =10003924

    MySQL a répondu:
    #1064 - Erreur de syntaxe près de 'a
    INNER JOIN _emailing_cleweb c ON a.intweb = c.intweb
    AND a.action_cleunik ' à la ligne 1
    Je ne pensais pas que l'on pouvait utiliser les jointures dans les delete.
    J'en ai donc essayé une autre, mais sans plus de succès :
    Erreur

    requête SQL:

    DELETE FROM _emailing_cleweb_attente a LEFT JOIN _emailing_cleweb c USING ( intweb ) WHERE a.action_cleunik =10003924

    MySQL a répondu:
    #1064 - Erreur de syntaxe près de 'a left join _emailing_cleweb c using(intweb) WHERE a.action_cleunik =10003924' à la ligne 1
    D'autres pistes ?

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 063
    Par défaut
    Peut-être en s'aidant de l'exemple dans la FAQ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DELETE a
    FROM _emailing_cleweb_attente a
    INNER JOIN _emailing_cleweb c ON a.intweb = c.intweb
      AND a.action_cleunik = c.action_cleunik
    WHERE a.action_cleunik = 10003924
    Pour utiliser la jointure dans un DELETE (ce qui est possible), il faut un alias à la table sur laquelle effectuer ce DELETE, et c'est cet alias qu'on met dès le début de la requête...
    Je n'ai pas testé mais c'est l'idée .

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Membre éprouvé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 934
    Par défaut
    Bingo

    Ca ne plante pas et de 1500.3601, on passe à 0.3295 sec ce qui est, ma fois, un très joli ratio !!!

    Merci beaucoup et au temps pour moi pour la faq ...

    Et merci aussi à cinephil

  6. #6
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 063
    Par défaut
    Belle illustration de la dégradation des performances avec les sous-requêtes .

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

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

Discussions similaires

  1. Optimisation DELETE
    Par poups dans le forum Oracle
    Réponses: 25
    Dernier message: 29/11/2010, 11h24
  2. Optimisation Update ou Delete + Insert
    Par Invité dans le forum Requêtes
    Réponses: 8
    Dernier message: 31/12/2009, 14h59
  3. Optimisation d'un delete
    Par niiccoo dans le forum Oracle
    Réponses: 11
    Dernier message: 29/05/2006, 10h57
  4. [Optimisation] SELECT avant un DELETE (base 10g)
    Par macben dans le forum Oracle
    Réponses: 2
    Dernier message: 23/05/2006, 17h42
  5. Optimisation de DELETE
    Par RitonLaBevue dans le forum Requêtes
    Réponses: 5
    Dernier message: 02/11/2005, 15h31

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