Newsgroup: it.comp.lang.delphi
Titolo: Problema per velocizzazione di una form

Ho un database di elevate dimensioni - Utilizzo D5; all'interno del mio
programmino prima di aprire una cera schermata faccio circa una trentina di
query per controllare se ci sono determinati records nel db... il mio
problema è che queste interrogazioni al database rendono lentissima
l'apertura della videata.. cosa mi consigliate per la velocizzazione del
processo?
Grazie
Paolo

 ha scritto nel messaggio
news:SipV6.19855$a44.2...@news1.tin.it...

Se usi un DB server (non Paradox & co. per intendeci) una bella Stored
Procedure potrebbe fare al caso tuo... :)
HTH
 Marco

 Procedure potrebbe fare al caso tuo... :)
Utilizzo DBF :-(

query per controllare se ci sono determinati records nel db... 
Ma scusami, fai 30 (TRENTA) query sulla stessa tabella ? 
Credo che finquando siamo a un numero cosi' elevato di query ci sia
ben poco da ottimizzare (se non le query stesse, ma sono troppe a mio
avviso).
--
Andrea Laforgia - walkietalkie(at)
libero.it
#exclude <windows.h>

Dipende se per "velocizzare l'apertura della videata" intendi la
visualizzazione del dataset prodotto oppure la visualizzazione della form
(senza il dataset).
Nel primo caso potresti provare con i seguenti accorgimenti:
a) Eliminare dalla select tutti i campi non indispensabili alla query
b) Richiamare il metodo PREPARE prima del metodo OPEN in modo da consentire
ad SQL server
   (o in misura molto minore al BDE) di ottimizzare la query
c) Ridurre la complessità della query (eliminando cursori o altre query
nidificate)
Nel secondo caso invece la soluzione è molto semplice:
Intercetta il metodo ONSHOW della form e piazzaci un bel timer che esegue
automaticamente
la query dopo 1,5 secondi.
In questo modo dai il tempo a windows di comporre la form interamente prima
di lanciare
le tue 30 query :)
Happy coding by,
Alessandro Loffredo.
-- 
Posted from 
smtp2.libero.it
 [193.70.192.52] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 le tue 30 query :)
Devo visualizzare il dataset.
Ti spiego meglio il funzionamento del mio programmino:
Ho una tabella TSTAMPE.DBF contenente tutti i valori da inserirmi dentro i
reports (sono circa 30); ho una videata contenente tutti i tipi di stampe
possibili per la commessa selezionata, ma naturalmente non è sicuro che le
stampe siano tutte disponibili, allora, prima di aprirmi la form di elenco
stampe, mi eseguo queste (30) query che mi attivano o disattivano il flag
della stampa. Le query sono di questo tipo:
{--- 1° STAMPA ---}
query2.Close;
query2.SQL.Clear;
query2.SQL.Add('SELECT CODC,CODS FROM TSTAMPE WHERE
CODC='''+inttostr(codice_commessa)+''' AND CODS=2');
query2.Prepare;
query2.Open;
if query2.RecordCount>0 then checkbox1.Enabled:=true
                        else checkbox1.Enabled:=false;
{--- 2° STAMPA ---}
query2.Close;
query2.SQL.Clear;
query2.SQL.Add('SELECT CODC,CODS FROM TSTAMPE WHERE
CODC='''+inttostr(codice_commessa)+''' AND CODS=3');
query2.Prepare;
query2.Open;
if query2.RecordCount>0 then checkbox1.Enabled:=true
                        else checkbox1.Enabled:=false;
{--- 3° STAMPA ---}
ECC...
CODC=codice commessa
CODS=codice stampa
Posso migliorarla ancora la query oppure ho sbagliato l'approccio al
problema?

CODS=codice stampa
Secondo me l'approccio e' errato:
perche' non fai una sola query  --
 'SELECT CODC,CODS FROM TSTAMPE WHERE
  CODC='''+inttostr(codice_commessa)'
e poi un bel loop per controllare quali CODS ti ritorna?
Ricordati che un loop, per quanto complesso sia, non sarà mai lento
come una SINGOLA query in cui devi fare tantissime cose.
Inoltre ho notato che per ogni query esegui un prepare, cosa inutile,
come inutile è ogni volta riscrivere la query.
Select CODC, CODS from TStampe where CODC = :CODC and CODS = :CODS 
e poi ParamByName('CODC').asInteger = x
ParamByName('CODS').asInteger = y
Altra cosa: evita, se possibile, di utilizzare recordcount che, con
molti SQL non funziona.
Insomma, il mio consiglio e' quello di riscrivere la routine vedrai
che, se riesci a renderla piu' logica, non ti accorgerai neppure che
viene eseguita.
Ciao,
Massimo.
-- 
"Ciao Rex, che cavolo di situazione eh? Due dentro, due fuori, puo' succedere di tutto!"

 viene eseguita.
Dovrei fare in questo modo quindi:
query2.close;
for i:=1 to 30 do begin
    Query2.Clear;
    Query2.SQL.Add('SELECT CODC,CODS FROM TSTAMPE WHERE
CODC='''+inttostr(codice_commessa))+''' AND CODS=''''+i);
    case i do
     1: if query2.RecordCount>0 then checkbox1.Enabled:=true
                                else checkbox1.Enabled:=false;
     2: if query2.RecordCount>0 then checkbox14.Enabled:=true
                                else checkbox15.Enabled:=false
     ecc..
     30:if query2.RecordCount>0 then checkbox19.Enabled:=true
                                 else checkbox18.Enabled:=false
    end;
end;
cosa ne, dici sarà più veloce?



No, fai ancora 30 query!
Vediamo, c'e' di meglio ma questa dovrebbe funzionare (e essere
veloce).
Prima disabilita tutti i checkBox e poi.
Query2.SQL.Add('Select CODC, CODS from TStampe where Codc = :Codc
order by CODS');
Query2.ParamByName('CODC').AsInteger = Codeice_Rimessa;
Query2.Open;
while not Query2.Eof do begin
  case Query2.FieldByName('CODS').AsInteger of
    1: CheckBox1.Enabled := True;
    2: ....
  end;
  Query2.Next;
end;
Query2.Close;
L'ho scritta di getto, non escludo errori :-)


 Query2.Close;
Missaca... 6 un grande... funziona benissimo ed č un missile rispetto a
prima... penso sia possibile fare ancora un'ottimizzazione: nella query fare
ancora un raggruppamento per CODS, cosa ne pensi?


No, nessun raggruppamento, semmai puoi togliere l'order by che, nel
caso di parecchi record rallenta molto.
Ciao, Rocco

 Ciao, Rocco
Pero' nel mio caso penso sia necessario fare un raggruppamento anche xchč ho
piů records con lo stesso codice... cosa ne pensi? Potrebbe velocizzare
ancora di piů... l'istruzione č GROUP BY ?

ancora di piů... l'istruzione č GROUP BY ?
Per raggruppare l'istruzione č proprio questa.
Ciao, Rocco.


No, niente group by, casomai un select distinc che ti torna un solo
record per tipologia.
