Newsgroup: it.comp.lang.visual-basic
Titolo: Estrema lentezza in un recordset disconnesso

La *prima* volta il programmino sotto riportato impiega una sessantina di 
secondi per eseguire il ciclo, fermandosi per parecchie decine di secondi 
all'incirca all'ottantesimo record, poi prosegue velocemente e completa il 
ciclo Do/Until fino all'ultimo record (dei 100 circa); il tutto appunto il 
60 secondi circa.
Le volte successive che eseguo il programma il tempo si riduce a circa 1/10 
di secondo ! Notate la differenza !
Chiudo VB6.
Lo riapro.
Riavvio il programma: il tempo è sempre pari a 1/10 di secondo.
Come ridurre a tempi accettabili, dell'ordine dei decimi di secondo, il 
tempo di esecuzione, la *prima* volta ?
Grazie per l'attenzione
AlpVir
rs.Open Criterio, cnn, adOpenForwardOnly
rsD.Fields.Append "Nome", adVarChar, 100
Do
    if  rs("A")=1  then
        rsD.AddNew
        rsD("Nome") = rs("Nome")
        rsD.Update
    end if
     rs.MoveNext
Loop Until rs.EOF
- rsD è il recordset disconnesso che alla fine comprende un centinaio di 
record
- rs è il recordset "matrice" (circa 8000 record)
- la condizione   rs("A")=1   è solo un esempio; in realtà essa è ben più 
complessa e non è assolutamente riproducibile con codice SQL 

 tempo di esecuzione, la *prima* volta ?
Se non erro puoi evitare l'update, dato che l'addnew implica update. Al
limite ne aggiungi uno a termine del ciclo, ma non credo cambi molto.
Bisogna vedere se la lentezza č a scorrere 8mila record, o a fare
100update.
Prova a remmare gli Rs.Addnew/update e vedi il tempo che impiega, e vedere
cosa rallenta.
Cioč:
Do
     rs.MoveNext
Loop Until rs.EOF

 cosa rallenta.
Avevo già applicato i tuoi 2 suggerimenti, senza alcun esito. Ho provato
anche ad aggiungere qualche DoEvents, ma .... niente.
In ogni caso la questione è più grave di quando segnalato nel primo post. Ho
fatto un errore: i record non sono 8000 ma 104 (11 campi, nessun memo, 4
campio testo di 50-100 caratteri) e sono il risultato di una query su 8000
record il cui tempo di esecuzione non mi pare sospetto (il rallentamento è
posteriore all'esecuzione della query).
I record testati, all'interno delle istruzioni if .. then, sono 98.
Il recordset disconnesso ha solo 5 campi :
      rsD.Fields.Append "Nome", adVarChar, 100
      rsD.Fields.Append "Distanza", adVarChar, 5
      rsD.Fields.Append "Azimut", adSingle
      rsD.Fields.Append "ID", adBigInt
      rsD.Fields.Append "Categoria", adChar, 3
Fino all'89 esimo va come una spia, poi rallenta quei 50-60 secondi per poi
proseguire appunto fino al 98esimo.
Ogni volta riavvio il computer.
Mistero !
AlpVir

>> tempo di esecuzione, la *prima* volta ?
Trovato l'inghippo.
Il mio recordset disconnesso prevede l'istruzione :
    rsD.Fields.Append "Nome", adVarChar, 100
E' bastato sostituire il tipo di variabile che tutto andasse a posto: 1/10 
di secondo per eseguire il loop di soli 104 record.
    rsD.Fields.Append "Nome", adChar, 100
Questo mi causerà numerose modifiche al restante codice ma almeno esso è 
veloce come desiderato.
Quindi ho imparato qualcosa di nuovo: nei recordset disconnessi non usare i 
tipi adVarChar.
Grazie a chi mi ha comunque fornito qualche suggerimento.
AlpVir