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

Langage SQL Discussion :

[DELETE]Beaucoup trop long


Sujet :

Langage SQL

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2003
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 159
    Par défaut [DELETE]Beaucoup trop long
    Bonjour,

    J'ai deux tables A et B. La table A contient une clé etrengère (idExt) vers la clé primaire de B(id). J'aimerais pouvoir purger la table B suivant le raisonnement suivant :

    Il faut supprimer tous les enregistrements de B, pour lesquels aucun élément de A contient une référence vers B(id).

    Le probleme est que ce que j'ai fais est beaucoup trop long. Je vous mets mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DELETE FROM B b WHERE b.id NOT IN (SELECT DISTINCT idExt from A) AND .... (des autres conditions).
    Mes tables comportent chacune environ 100 000 enregistrements.

    Merci d'avance.

  2. #2
    Membre expérimenté Avatar de TheRussian
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 200
    Par défaut
    Bonjour,

    peut-être qu'avec un NOT EXISTS :

    DELETE FROM B b WHERE NOT EXISTS (SELECT * from A where b.Id = a.IdExt and .... autres conditions)
    je n'ai pas testé, donc .....

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Une remarque au passage mais qui ne répond pas à ta question : ta requête n'est pas conforme vis-à-vis de la norme SQL (sauf erreur de ma part) : tu ne peux pas employer un alias sur une table à laquelle tu appliques un INSERT, UPDATE ou DELETE.

  4. #4
    Membre expérimenté Avatar de souellet
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 155
    Par défaut
    Tu peux enlever le DISTINCT dans ta sous-requête,
    il n'est pas nécessaire et probablement que ça va améliorer la performance.
    Enlève les alias, ils ne sont pas nécessaire.

    C'est quoi ton SGBD?
    En DB2, le NOT EXISTS est moins performant que le NOT IN.
    Bonne journée!

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2003
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 159
    Par défaut
    Je travaille sous Oracle. Et je me suis trompé c'est un NOT IN et non un NOT EXIST.

    Merci.

  6. #6
    Membre éprouvé
    Inscrit en
    Octobre 2005
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 125
    Par défaut
    Quel est l'EXPLAIN PLAN de ta requete SELECT ?
    Tu as bien un index sur b.id ?
    Vu que tu utilises un NOT IN, ca veut dire que ta requete SELECT ne va pas te ramener plus de 1024 registres, donc a mon avis il faut optimiser d'abord ta requete SELECT car un DELETE sur 1000 ID max avec un index ca doit se faire tres rapidement...

  7. #7
    Membre Expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Par défaut
    Le select de ces mêmes lignes est-il long ?
    si non, on peut envisager des problèmes de verrous, waits ou autres problèmes de rollback.

    Si oui, c'est simplement un problème d'optimisation de la requête/structure des tables

Discussions similaires

  1. [11gR2] INSERT beaucoup trop long
    Par tchorlz dans le forum SQL
    Réponses: 3
    Dernier message: 03/07/2014, 15h27
  2. delete trop long à cause d'une fk ou des stats oracle ?
    Par ekremyilmaz dans le forum Oracle
    Réponses: 2
    Dernier message: 22/12/2010, 16h29
  3. MS SQL 2000 - Job SQL Agent beaucoup trop long
    Par williamc73 dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 18/11/2009, 14h08
  4. DELETE Trop long
    Par pconrad dans le forum SQL
    Réponses: 8
    Dernier message: 05/02/2008, 09h52
  5. Arrêter un prog si temps de connexion trop long
    Par jakouz dans le forum Langage
    Réponses: 4
    Dernier message: 22/10/2002, 18h28

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