Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Triple Inner Join mit über 10.000 Zeilen und Asp-Berechnungen verzögert die Anwendung

Lassen Sie uns dies analysieren, wobei wir auch bedenken, dass SQL eine ORDER BY-Klausel hat:-

do until rs.eof 
  response.flush 
  counter = counter + 1 

  ' A LOT of calculations and putting in array... 

  rs.movenext 
loop

Beachten Sie die Response.Flush , das würde ich als erstes wegschmeißen. Wahrscheinlich müssen Sie das Pufferlimit für ASP-Antworten (im IIS-Manager) erhöhen. Flush sendet den bisher generierten Inhalt an den Client, es wartet darauf, dass der Client den Empfang aller gesendeten Pakete bestätigt, bevor es den Vorgang abschließt. Ich schätze, dass dort 90 % der über 5 Minuten verbracht werden.

Jetzt "VIEL Berechnungen". VBScript ist nicht für seine Leistung bekannt. Dieser Code kann durchaus einige Zeit in Anspruch nehmen. In einigen Fällen können einige Berechnungen viel besser mit SQL durchgeführt werden als mit Skripten, daher ist dies eine Option. Eine andere wäre, eine COM-kompilierte Komponente zu erstellen, um komplexe Aufgaben zu erledigen (obwohl einige Buchhaltungen für das Marshalling erstellt werden müssen, was die Vorteile zunichte machen kann). Es kann jedoch unvermeidlich sein, dass Sie diese Berechnungen in VBScript durchführen müssen.

Jetzt rs.movenext . Diese Schleife bedeutet, dass Sie die Verbindung und das Rowset so ziemlich die ganze Zeit offen halten, während die Verarbeitung erforderlich ist. Das ist, während die Server Bytes über das Netzwerk an den Client senden und während VBScript Zahlen verarbeitet. Ein viel besserer Ansatz wäre, das gesamte Rowset schnell aufzusaugen und dann von der DB zu trennen Knirschen Zahlen und endlich Den Puffer an den Client ausgeben.

Erwägen Sie die Verwendung eines getrennten Recordsets (Sie geben einen clientseitigen statischen Cursor an) oder sogar das einfache GetRows -Methode des Recordset-Objekts, die das gesamte Rowset in ein zweidimensionales Array ausgibt. Dies bedeutet, dass Sie Sperren für die verschiedenen Tabellen so kurz wie möglich aufrechterhalten.