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:
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!
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.
Ü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.
Tags und Links optimization database asp.net orm query-optimization