Problème de lenteur des réquêtes SQL avec Delphi 7

Utilisateur anonyme - 20 juil. 2010 à 09:17
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 26 juil. 2010 à 20:14
Amis programmeurs, bonjour,

cela doit être la trois ou quatrième fois que je laisse un message sur un forum de ma vie, pour un problème de programmation, car j'ai toujours trouvé une réponse quelque part enfoui dans le net. Mais là, je cale, sur une chose qui me paraît pourtant simple.

J'ai un projet à faire sous Delphi 7, avec une communication avec une base de données locale (MS SQL 2000). Dans cette base de données, se trouvent plusieurs tables (organisées pareilles). Chaque table est conséquente, puisque j'en ai une qui atteint maintenant les 150 millions de lignes, et cela ne cesse d'augmenter.

Dans mon application Delphi j'aimerais récupérer tous les numéros id qui correspondent aux critères de recherche de l'utilisateur. Pour ce faire, j'utilise un SELECT, mais mon application plante, car la recherche des éléments est trop longue (par ailleurs, la mémoire programme utilisée passe de 9 Mo à 50 Mo en peu de temps).

Donc j'aimerais savoir si quelqu'un peu me dire, s'il existe une solution rapide pour récupérer ces id ?

Voici le bout de code qui récupère les id :

requeteSQL:='SELECT '+produit+'.id FROM '+produit+' WHERE (id_produit = '+inttostr(numIdProduit)+') AND (id_machine = '+inttostr(numMachine)+') AND (id_mesure = '+inttostr(numMesure)+')'; 
with Query do begin
    Close;
    SQL.Clear;
    SQL.Text:=requeteSQL;
    Open;
    nbRecords:=RecordCount;
    if nbRecords<>0 then begin
      log.Caption:=log.Caption+#13+'Records id : '+IntToStr(nbRecords)+' lignes';
      while not Eof do begin
        numId:=FieldByName('id').AsInteger;
        Next;
      end;
    end else begin
      log.Caption:=log.Caption+#13+'!!!Recherche... => données inexistentes !!!';
    end;
    Close;
  end;


[i]requeteSQL => String
Query => TADOQuery/i

Au préalable, je récupère quatre informations : le nom de la table (var produit), un numéro de produit (var numIdProduit), un numéro de machine (var numIdMachine) et un numéro de type de mesure (var numIdMesure)
mais la requêtes ne renvoie jamais mon résultat (car mon appli plante).

Voici l'organisation de ma table dans laquelle je fait ma recherche :


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ id + id_produit + id_machine + id_mesure + autres_donnees +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+_1__+_15_________+_16_________+_2_________+................+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ etc.......................................................+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



Pour de plus amples informations, je peux répondre à vos questions, si je ne suis pas assez clair.

Merci d'@vance

@++;

P.S : je suis débutant en Delphi

2 réponses

WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
20 juil. 2010 à 18:52
Bonjour

Pourquoi utilises-tu un FieldByName ? Tu sais déjà que la requete ne contiendra qu'une seule colonne de résultat (de part ton SELECT), donc, il me semble qu'un accès direct à Fields serait plus efficace (Même si, cela ne solutionnera pas entièrement ton problème) plutot que de demander à chaque fois de rechercher où se trouve le champ Id :
NumId := Fields[0].Value

Cordialement.
"L'imagination est plus importante que le savoir." Albert Einstein
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
26 juil. 2010 à 20:14
Bonsoir,

Pourrais-tu préciser quels sont les index déclarés sur les tables objets des recherches avec la requête ci-dessus ?
S'il n'y en a pas, cela explique en grande partie la lenteur des requêtes...

D'autre part, à quoi cela sert-il de parcourir l'ensemble de données renvoyé par la requête si tu n'en fait rien ?
while not Eof do begin
  numId:=FieldByName('id').AsInteger;
  Next;
end;



May Delphi be with you

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
Rejoignez-nous