Exécution d'une requête très lente [Résolu]

diabolokev 9 Messages postés mercredi 1 février 2012Date d'inscription 10 janvier 2013 Dernière intervention - 7 mars 2012 à 09:40 - Dernière réponse : diabolokev 9 Messages postés mercredi 1 février 2012Date d'inscription 10 janvier 2013 Dernière intervention
- 8 mars 2012 à 14:31
Bonjour,

J'ai un petit problème lors de l'exécution de ma requête, elle est très longue (30 minutes environ pour 8200 lignes).

Le principe de mon code :
J'ai un fichier, j'extrais les informations dans un Grid sous Delphi puis je lance ma requête pour identfier le magasin et le déposant pour chaque colis.


//Requête pour identifier les colis
     QUtil.SQL.Clear;
     QUtil.SQL.Add (' select MAGASIN, DEPOSANT, NUMCOLIS, NUMINTERNE  ');
     QUtil.SQL.Add (' from TABLECOLIS, TABLEINTERNE                   ');
     QUtil.SQL.Add (' where NUMCOLIS= NUMINTERNE                      ');
     QUtil.SQL.Add (' and DATE > add_months(TO_DATE('+ QuotedStr(periode) +', ''DD/MM/YY''), -3) ');
     QUtil.SQL.Add (' and  NOMCOLIS = (' + QuotedStr(Colis) + ')  ');
     QUtil.Open;
     QUtil.First;

     Magasin := QUtil.FieldByName('MAGASIN').AsString;
     Deposant := QUtil.FieldByName('DEPOSANT').AsString;
     If QUtil.FieldByName('NUMCOLIS').AsString <> '' then
     NCO := QUtil.FieldByName('NUMCOLIS').AsInteger;
     If QUtil.FieldByName('NUMINTERNE').AsString <> '' then
     NUM := QUtil.FieldByName('NUMINTERNE').AsString;


Ce que je voudrais, c'est qu'elle s'exécute plus rapidement. Si vous avez une idée, je suis preneur.

Merci d'avance.

Diabolokev.
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 7 mars 2012 à 11:30
3
Merci
Bonjour,

Tu utilises quel SGBD ?

Tu utilises un index ? Si ce n'est pas le cas, c'est peut être une piste.

Sinon, je ne sais pas exactement d'où viennent tes paramètres, mais tu n'as peut être pas besoin de faire des jointures, il suffirait que tu fasses une requête SELECT interne je pense.

Merci cs_Julien39 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 120 internautes ce mois-ci

Commenter la réponse de cs_Julien39
diabolokev 9 Messages postés mercredi 1 février 2012Date d'inscription 10 janvier 2013 Dernière intervention - 8 mars 2012 à 08:50
0
Merci
Bonjour,

Je suis sous Oracle.
En effet je n'avais pas d'index, au lieu de 30 minutes, je suis à 24 secondes pour 8000 lignes.

Merci.
Commenter la réponse de diabolokev
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 8 mars 2012 à 10:11
0
Merci
8000 lignes 24 secondes, c'est encore très lent ?

Tu as essayé de recalculer les statistiques ?

Tu fais des jointures ?

Tu ouvres plusieurs connexions ?
Commenter la réponse de cs_Julien39
diabolokev 9 Messages postés mercredi 1 février 2012Date d'inscription 10 janvier 2013 Dernière intervention - 8 mars 2012 à 11:41
0
Merci
Tu trouves que c'est encore lent ?

Que veux-tu dire par recalculer les statistiques ?

J'ai besoin d'une seule jointure que j'ai déjà mit.

Je n'ouvres qu'une seule connexion.
Commenter la réponse de diabolokev
cs_Julien39 6450 Messages postés mardi 8 mars 2005Date d'inscription 17 mai 2018 Dernière intervention - 8 mars 2012 à 13:39
0
Merci
Alors essayes de remplacer ta jointure par une requete SELECT interne. Oracle calcul des statistiques qui lui permettent d'optimiser son plan d'exécution, quelques fois, il arrive que ces statistiques ralentissent un nouvelle requête sur la base.

Tu trouveras comment faire pour recalculer les stats sur internet.

Après, si la vitesse d'exécution te convient, c'est le principal.
Commenter la réponse de cs_Julien39
diabolokev 9 Messages postés mercredi 1 février 2012Date d'inscription 10 janvier 2013 Dernière intervention - 8 mars 2012 à 14:31
0
Merci
Je regarderai ça.
Pour le moment le gain de temps me parait rentable.

Je te remercie de ton aide.
Commenter la réponse de diabolokev

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.