ASP.NET/SQL 2008 Leistungsproblem

8

Wir haben ein System mit einem Suchbildschirm entwickelt, der ungefähr so ​​aussieht:

Ссылка

Wie Sie sehen können, gibt es einige recht seriöse Suchfunktionen. Sie können eine beliebige Kombination aus Status, Kanälen, Sprachen und Kampagnentypen verwenden und diese dann anhand des Namens usw. eingrenzen.

Sobald Sie gesucht haben und die Leads unten erscheinen, können Sie die Header sortieren.

Die Abfrage verwendet ROWNUM, um ein Paging-Schema auszuführen. Daher geben wir nur etwa 70 Zeilen gleichzeitig zurück.

Das Problem

Obwohl wir nur 70 Zeilen zurückgeben, passiert eine Menge IO und Sortierung. Das macht natürlich Sinn.

Dies hat immer zu kleineren Spitzen in der Disk Queue geführt. Es fing an langsamer zu werden, als wir 3 Millionen Leads erreichten, und jetzt, wo wir näher an 5 kommen, pegelt die Disk Queue manchmal bis zu einer Sekunde oder zwei gerade.

Das wäre tatsächlich noch machbar, aber dieses System hat einen anderen Bereich mit einem zeitkritischen Prozess, sagen wir der Einfachheit halber, dass es ein Webservice ist, der Antworten sehr schnell liefern muss, oder dass es eine Zeitüberschreitung auf der anderen Seite verursacht Ende. Die Disk Queue-Spikes führen dazu, dass sich dieses Teil zusammenzieht, was zu Downtime-Zeitüberschreitungen führt. Das Endergebnis sind tatsächlich Telefonanrufe in unserem automatisierten VoiceXML-basierten IVR, und das ist sehr schlecht für uns.

Was wir versucht haben

Wir haben es versucht:

  • Wartungsaufgaben, die die Anzahl der Ableitungen im System auf das absolute Minimum reduzieren.
  • Die offensichtlichen Indizes wurden hinzugefügt.
  • Lief den Index-Tuning-Wizard in Profiler an und verwendete die meisten seiner Vorschläge. Einer von ihnen würde mehr oder weniger den gesamten Tisch innerhalb eines Indexes reproduzieren, also habe ich ihn von Hand bearbeitet, um ein bisschen weniger zu machen.
  • Mehr RAM zum Server hinzugefügt. Es war ein wenig niedrig, aber jetzt hat es immer etwas wie 8 gigs Leerlauf, und der SQL Server ist konfiguriert, um nicht mehr als 8 Gigs zu verwenden, aber es verwendet nie mehr als 2 oder 3. Ich fand das merkwürdig. Warum legt man nicht die ganze Tabelle in den RAM? Es sind nur 5 Millionen Leads und es gibt genug Platz.
  • Wurde über Abfrageausführungspläne ausgegeben. Ich kann sehen, dass zu diesem Zeitpunkt die Indizes meistens ihre Arbeit machen - etwa 90% der Arbeit findet während der Sortierung statt.
  • Betrachtet, die Leads-Tabelle auf ein anderes physisches Laufwerk zu verteilen, aber wir haben keine Ressourcen dafür, und es scheint, dass es nicht notwendig sein sollte.

Beim Schließen ...

Ein Teil von mir fühlt sich an, als ob der Server damit umgehen könnte. Fünf Millionen Datensätze sind nicht so viele angesichts der Macht dieses Servers, der ein anständiger Quadcore mit 16 GB Ram ist. Ich kann jedoch sehen, wie der Sortierbereich Millionen von Zeilen berührt, um nur eine Handvoll zurückzugeben.

Was haben Sie in solchen Situationen getan? Mein Instinkt ist, dass wir vielleicht ein wenig Funktionalität einbüßen sollten, aber wenn es einen Weg gibt, das intakt zu halten, wird mir das einen Krieg mit der Geschäftseinheit ersparen.

Vielen Dank im Voraus!

    
Brian MacKay 20.01.2011, 16:11
quelle

3 Antworten

3

Datenbank-Engpässe können häufig verbessert werden, indem Sie Ihre SQL-Abfragen verbessern. Wenn Sie nicht wissen, wie diese aussehen, sollten Sie in Erwägung ziehen, einen operativen Datenspeicher oder ein Data Warehouse zu erstellen, die Sie nach Zeitplan füllen.

Manchmal müssen Sie Ihre komplexen relationalen Datenbanken abflachen. Es kann dazu führen, dass Abfragen erheblich schneller ausgeführt werden und die Optimierung Ihrer Abfragen erheblich vereinfacht wird, da das Modell sehr flach ist. Dadurch kann auch leichter festgestellt werden, ob der Datenbankserver nach oben oder nach unten skaliert werden muss. Eine Kapazitäts- und Wachstumsanalyse kann dazu beitragen, diesen Anruf zu tätigen.

Transaktions / hoch normalisierte Datenbanken sind normalerweise nicht so skalierbar wie ODS oder Data Warehouse.

Bearbeiten: Ihr ORM hat möglicherweise auch Optimierungen, die es möglicherweise zu prüfen lohnt, anstatt nur zu untersuchen, wie die Abfragen optimiert werden, die es an Ihre Datenbank sendet. Wenn Sie Ihr ORM für die Berichte umgehen, könnte dies eine Möglichkeit sein, Ihre Abfragen vollständig zu steuern, um eine bessere Leistung zu erzielen.

    
Shan Plourde 20.01.2011, 16:53
quelle
2

Überlegen Sie, wie Ihr ORM die Abfragen erstellt. Wenn Sie eine schlechte Suchleistung haben, könnten Sie vielleicht versuchen, gespeicherte Prozeduren zu verwenden, um Ihre Ergebnisse zurückzugeben, und, falls erforderlich, mehrere gespeicherte Prozeduren, die speziell auf die Suchkriterien zugeschnitten sind.

    
Matthew 20.01.2011 19:33
quelle
2
  1. Bestimmen Sie, welche Ad-hoc-Abfragen höchstwahrscheinlich ausgeführt werden oder begrenzen Sie die Suchkriterien mit gespeicherten Prozeduren .. Können Sie Daten zusammenfassen? .. Behandeln Sie diese
    App wie ein Data Warehouse.
  2. Erstellen Sie Indizes für jede Spalte, die an der Suche beteiligt ist, um Tabellendurchsuchungen zu vermeiden.
  3. erstellt Fragmente in Ausdrücken.
  4. Aktualisieren Sie regelmäßig die Daten und aktualisieren Sie Statistiken, wenn mehr Leads geladen werden.
  5. legt die temporären Dateien, die von Abfragen (Resultsets) erstellt wurden, in Ramdisk ab.
  6. erwägt die Migration zu einer leistungsstarken RDBMS-Engine wie Informix OnLine.
  7. Leiten Sie einen anderen Thread ein, um während der Abfrage
    die Anzeige von N Zeilen aus der Ergebnismenge zu starten wird weiterhin ausgeführt.
Frank R. 20.01.2011 16:37
quelle