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 :

Question de performance


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 273
    Points : 118
    Points
    118
    Par défaut Question de performance
    Bonjour,

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select count(*) from 
    (select * from TABLE1 A where EXISTS (select A.NAME FROM TABLE2 B WHERE B.ID=A.ID WHERE TO_CHAR(B.mydate,'yyyy') = '2009')), 
    (select * from TABLE2 C WHERE TO_CHAR(C.MYDATE,'YYYY') = '2009')
    Sachant que j'ai plusieurs centaines de milliers de records, cette requête est très très longue.

    Y a-t- il moyen de l'améliorer?

    Merci

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Oui votre requête est horriblement mal écrite (il y a un produit cartésien).
    Je n'arrive même pas à savoir ce que vous voullez compter.

    Pouvez-vous nous décrire, en français, ce que vous voullez faire ?

  3. #3
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 273
    Points : 118
    Points
    118
    Par défaut
    OK donc voilà: j'ai 2 tables.

    Mon but est de supprimer tous les records de la table A qui ont une date égale à 2009 et supprimer tous les records de ma table B qui ont un lien avec les records de ma table .

    Par ex:

    TableA
    ID DATE
    1 10/10/2008
    2 30/12/2009
    3 15/02/2009

    TableB
    ID TA_ID
    1 2
    2 3
    3 NULL

    La requête devrait supprimer la ligne 2 et 3 de la tableA ainsi que le ligne 1 et 2 de la tableB.

    Je sais que ma requête précédente ne faisait pas çà mais le but final est de supprimer. Ma requête avec le select était un test pour voir si il allait me retourner les bons records.

    Merci

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Merci, c'est plus clair.
    Avez-vous une clef étrangère entre vos tableA et tableB ?
    Quelle est la cardinalité de cette relation ((1,1), (0,n)...) ?

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 273
    Points : 118
    Points
    118
    Par défaut
    oui je dispose d'une clé étrangère de la table A dans la table B.

    Cardinalités: tableA 1 tableB N

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour, tu n'as pas précisé ton sgbd.
    Sous Oracle, en deux temps :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    delete from tableB tb
    where exists
    	  (	
    	  	select * from tableA ta
    		where tb.ta_id = ta.id
    		and trunc(ta.date,'y') = '01/01/2009'
    	  ); 
     
    delete from tableA ta
    where trunc(ta.date,'y') = '01/01/2009';
    Soit dit en passant, 'date' est un mot clé, mieux vaut éviter de l'utiliser comme nom de champs.

  7. #7
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 273
    Points : 118
    Points
    118
    Par défaut
    Bonjour,

    Je sais que je peux le faire en 2 requêtes mais j'aimerais le faire en 1 seule (si c'est possible).

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Tu n'as toujours pas précisé ton sgbd.
    Tu peux quand même lire ce thread :
    http://www.developpez.net/forums/d11...sieurs-tables/

  9. #9
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 273
    Points : 118
    Points
    118
    Par défaut
    oups désolé ... mon sgbd est oracle 9

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Ca donnerai quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DELETE FROM 
    (SELECT * FROM tableA ta, tableB tb 
    WHERE (ta.ID = tb.ta_id) AND trunc(ta.date,'y') = '01/01/2009');
    J'ai jamais testé, ça n'est d'ailleurs pas conseillé, pourquoi ne pas vouloir le faire en deux requete? ou utiliser ON DELETE CASCADE?

  11. #11
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 273
    Points : 118
    Points
    118
    Par défaut
    Je vais plutôt essayer le on delete cascade.

    Merci pour l'aide

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

Discussions similaires

  1. Utilisartion d'une arraylist dans une boucle, question de performance
    Par Djobird dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 20/07/2007, 17h28
  2. [WPF] Encore les images - question de performances
    Par BruceWayne dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 13/06/2007, 13h23
  3. question de performance : transtypage ou pas ?
    Par brice01 dans le forum Développement 2D, 3D et Jeux
    Réponses: 6
    Dernier message: 19/03/2007, 16h04
  4. [question de performance]
    Par viny dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 18/08/2005, 22h48
  5. Question de performance
    Par davidx dans le forum Requêtes
    Réponses: 2
    Dernier message: 27/11/2003, 22h55

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