Pojďme to analyzovat a zároveň mít na paměti, že SQL má klauzuli ORDER BY:-
do until rs.eof
response.flush
counter = counter + 1
' A LOT of calculations and putting in array...
rs.movenext
loop
Všimněte si Response.Flush
, první věc, kterou bych udělal, je zbavit se toho. Pravděpodobně budete muset zvýšit limit ASP Response Buffering Limit (ve správci IIS). Flush odesílá dosud vygenerovaný obsah klientovi, před dokončením čeká, až klient potvrdí příjem všech odeslaných paketů. To je místo, kde budu hádat, že 90 % z 5+ minut je vynaloženo.
Nyní "HODNĚ výpočtů". VBScript není známý pro svůj výkon. Tento kód může nějakou dobu trvat. V některých případech lze některé výpočty provádět mnohem lépe pomocí SQL než ve skriptu, takže je to jedna z možností. Dalším by bylo sestavit nějakou kompilovanou komponentu COM, která by dělala složitou práci (ačkoli některé účetnictví musí být vytvořeno pro seřazení, což může zničit výhody). Může však být nevyhnutelné, že budete muset provést tyto výpočty ve VBScriptu.
Nyní rs.movenext
. Tato smyčka znamená, že budete mít připojení a sadu řádků otevřené téměř po celou dobu, kdy je zpracování vyžadováno. To je, když servery posílají bajty přes síť klientovi a zatímco VBScript shromažďuje čísla. Mnohem lepší přístup by byl rychle vysát celou sadu řádků a odpojit se od DB, pak crunch čísla a konečně vypsat vyrovnávací paměť klientovi.
Zvažte použití odpojené sady záznamů (zadáte statický kurzor na straně klienta) nebo dokonce jednoduchého GetRows
metoda objektu sady záznamů, která vypíše celou sadu řádků do 2rozměrného pole. To znamená, že budete udržovat zámky na různých stolech co nejkratší dobu.