Analizziamolo tenendo presente anche che SQL ha una clausola ORDER BY:-
do until rs.eof
response.flush
counter = counter + 1
' A LOT of calculations and putting in array...
rs.movenext
loop
Nota il Response.Flush
, la prima cosa che farei è liberarmene. Probabilmente dovrai aumentare il limite di buffering della risposta ASP (in gestione IIS). Flush sta inviando il contenuto generato finora al client, attende che il client riconosca la ricezione di tutti i pacchetti inviati prima del completamento. È qui che immagino che venga speso il 90% degli oltre 5 minuti.
Ora "MOLTI calcoli". VBScript non è noto per le sue prestazioni. Questo codice potrebbe richiedere del tempo. In alcuni casi alcuni calcoli possono essere eseguiti molto meglio da SQL che in script, quindi questa è un'opzione. Un altro sarebbe quello di creare un componente compilato COM per eseguire lavori complessi (sebbene sia necessario effettuare un po' di contabilità per il marshalling che può vanificare i vantaggi). Tuttavia, potrebbe essere inevitabile dover eseguire questi calcoli in VBScript.
Ora rs.movenext
. Questo ciclo significa che tieni la connessione e il set di righe aperti praticamente per tutto il tempo in cui è richiesta l'elaborazione. Questo è mentre i server inviano byte sulla rete al client e mentre VBScript sta elaborando numeri. Un approccio molto migliore sarebbe risucchiare rapidamente tutto il set di righe e disconnettersi dal DB, quindi numeri crunch e finalmente scarica il buffer sul client.
Prendi in considerazione l'utilizzo di un recordset disconnesso (specifica un cursore statico lato client) o anche il semplice GetRows
metodo dell'oggetto recordset che esegue il dump dell'intero set di righe in una matrice bidimensionale. Ciò significa che manterrai i blocchi sui vari tavoli per il minor tempo possibile.