Plötzliche Performance-Drop in ASP.NET Web-App; DB-Index benötigt?

Ich habe eine ASP.NET 2.0 Web-App, die von einer ziemlich komplexen SQL server-database unterstützt wird (viele Tische und viele Joins, die in vielen Abfragen geschehen). Meine Protokolle zeigen, dass eines Tages die serverseitige Ladezeit für einen bestimmten Seitentyp deutlich gesunken ist. Es war in der Regel unter 100ms, aber manchmal bis etwa 200ms vor, und es ging über über 600ms und ist dort seit (vor über einer Woche). Das vorherige Mal, als wir den neuen Code in die Produktion migrierten, war fast zwei Wochen bevor dies geschah, und es gab kein großes Volumen an neuen data, die zu diesem timepunkt in das System gebracht wurden.

Ich habe diesen falschen Seite-Typ in unserer Testumgebung (das ist weniger kräftig als die Produktion natürlich) und sah es durchschnittlich bei rund 450ms, was höher ist als ich will, aber nicht so hoch wie die Produktion. Das ist komisch; Ich würde erwarten, dass die Testumgebung langsamer als die Produktion läuft, da sie im Wesentlichen den gleichen datasatz haben.

Ich verkleinerte es auf einen database-Aufruf (eine Zeile von C #), die in der Nähe von 200ms diente, um eine gespeicherte Prozedur aufzurufen und die Ergebnisse in .NET-objecte zusammenzubringen (die große Mehrheit dieser time ist in der DB). Ich zog diesen Sproc, kopierte den Körper von ihm und hatte SQL server Manager mir den geschätzten Ausführungsplan. Es hat mir gesagt, dass es einen fehlenden nicht gruppierten Index gab, den ich erschuf; das brachte die time auf den databaseaufruf in Frage unter 100ms. Einige weitere Untersuchungen zeigten, dass es keine andere signifikante performance sinkt auf dieser Seite Typ.

Also habe ich die Dinge etwas verbessert, und ich bin versucht, diesen Index in der Produktion zu erstellen und zu sehen, ob die Seitenladezeit deutlich abnimmt. Aber ich habe immer noch Fragen, die mir zuhören und das würde ich lieber antworten, bevor ich mich in der Produktion verwende:

  • Warum würde die performance plötzlich fallen? Wenn es einfach ein fehlender Index wäre, würde ich erwarten, dass es ein Faktor gewesen ist (langsam abnehmende performance, wenn mehr data hinzugefügt werden).
  • Warum sollte es besser sein als die Produktion, wenn es den gleichen datasatz hat?

Ich weiß, dass niemand mir von meiner App erzählen kann, aber ich hoffe auf einen Einblick in die Art und Weise, wie sich die Dinge so ändern können.

EDIT: Ich habe den Index zur Produktion hinzugefügt und es brachte die Seite Ladezeit wieder auf rund 100ms. Ich verstehe immer noch nicht ganz, was passiert ist. Vielleicht klickt es eines Tages, wenn ich etwas scheinbar ohne Bezug zu databaseen und SQL lese.

Die performance eines Ausführungsplans in MSSQL ist komplex vorhersagen. Es könnte sein, dass der fehlende Index die Ausführungszeit mit dem Quadrat der Größe der Tabelle erhöht. Das würde es so aussehen lassen, wie es funktioniert, arbeitet, arbeitet und dann plötzlich schmerzhaft langsam wird.

Wenn das Management-Studio einen fehlenden Index anzeigt, dann sollten Sie ihn (oder einen anderen, noch intelligenten Index) der Produktionsumgebung hinzufügen.

Dennoch sind 100ms für eine Sp-Run von einer ASP-Seite ziemlich lang. Wenn die Seite viel benutzt wird, versuchen Sie, die sp.