Sollte die Abfrageoptimierung proaktiv oder reaktiv sein?

23

Als Softwareentwickler und aufstrebender DBA versuche ich, Best Practices beim Entwerfen meiner SQL Server-Datenbanken zu berücksichtigen (99% der Zeit, in der sich meine Software auf SQL Server befindet). Ich erstelle das bestmögliche Design vor und während der Entwicklung.

Aber genau wie bei jedem anderen Softwareentwickler gibt es zusätzliche Funktionen, Fehler und lediglich Änderungen der Anforderungen, die geänderte / erstellte Datenbankobjekte erfordern.

Meine Frage ist, sollte die Abfrageoptimierung proaktiv oder reaktiv sein? Mit anderen Worten, sollte ich ein paar Wochen nach einigen umfangreichen Code- / Datenbankänderungen einen Tag aussetzen, um die Abfrageleistung zu überprüfen und darauf basierend zu optimieren? Auch wenn es okay zu laufen scheint ?

Oder sollte ich mir nur darüber im Klaren sein, dass eine unterdurchschnittliche Leistung eine Datenbankprüfung sein und zur sprichwörtlichen Tafel zurückkehren sollte?

Die Optimierung von Abfragen kann viel Zeit in Anspruch nehmen. Abhängig vom anfänglichen Datenbankdesign ist dies möglicherweise nur ein minimaler Vorteil. Ich bin gespannt auf den akzeptierten Modus Operandi.

Thomas Stringer
quelle
7
Vorzeitige Optimierung ist die Wurzel allen Übels - Donald Knuth
Drasill
@Drasill, kannst du das bitte näher erläutern? Böse wie in verschwendeter Entwicklungszeit?
Thomas Stringer
eigentlich hat mich deine frage über dieses berühmte zitat nachdenken lassen ( siehe google ). Aber es ist eher auf die Softwareentwicklung ausgerichtet. Ich denke, es passt nicht wirklich zu DBA. Zuletzt würde ich selbst sagen "Vorzeitige Mikrooptimierung ist böse".
Drasill
Siehe auch einen alten Coding-Horror-Beitrag zu diesem Thema :)
Drasill

Antworten:

17

Beides, aber meistens proaktiv

Es ist wichtig, während der Entwicklung auf realistische Datenmengen und -qualität zu testen. Es ist unglaublich üblich, dass eine Abfrage in 100 oder 1000 Zeilen eines Entwicklers ausgeführt wird und dann mit 10 Millionen Produktionszeilen gleich bleibt.

Hier können Sie auch Notizen zu "index may help here" machen. Oder "besuchen Sie mich". Oder "wird mit der neuen Funktion xxx in der nächsten DB-Version behoben".

Einige Abfragen werden jedoch nicht den Test der Zeit bestehen. Die Datenverteilung ändert sich oder sie wird exponentiell, da das Optimierungsprogramm einen anderen Verknüpfungstyp verwendet. In diesem Fall können Sie nur reagieren.

Zumindest für SQL Server können die verschiedenen DMV-Abfragen "Fehlender Index" und "Längste Abfrage" Problembereiche vor dem Telefonanruf anzeigen

Bearbeiten: um zu klären ...

Proaktiv bedeutet nicht, jetzt jede Abfrage zu optimieren. Dies bedeutet, dass Sie das, was Sie benötigen (häufig ausführen), auf eine angemessene Reaktionszeit einstellen. Ignorieren Sie die wöchentlichen Berichtsabfragen am Sonntag um 3 Uhr morgens.

gbn
quelle
16

OK, ich werde beißen und eine gegenteilige Ansicht vertreten. Zunächst einmal würde ich sagen, dass Sie niemals damit beginnen sollten, etwas zu tun, von dem Sie wissen, dass es Sie in Schwierigkeiten bringt. Wenn Sie dies als Best Practices bezeichnen möchten, fahren Sie fort. Dies ist so weit wie proaktiv sein sollte.

Danach wird Zeit (und Geld) verschwendet. Machen Sie also weiter und liefern Sie Ihr Produkt aus. Verwenden Sie diese Zeit für zusätzliche Tests, einschließlich Lasttests, anstatt tonnenweise Abstimmungsabfragen in der Entwurfszeit durchzuführen, die sich möglicherweise als Engpässe herausstellen oder nie herausstellen.

Wenn Sie feststellen, dass etwas nicht Ihren Entwurfsspezifikationen entspricht, oder wenn etwas in die unteren 10% oder 20% der Antwortzeiten Ihres Profils fällt, investieren Sie die Zeit, die Sie zum Optimieren der jeweiligen Einstellungen benötigen gebrochen.

In einer perfekten Welt würde alles von Anfang an perfekt entworfen und mit einer logischen Build-Sequenz entwickelt. In der realen Welt gibt es Einschränkungen in Bezug auf Budget und Zeit, und Ihre Testdaten sehen möglicherweise nicht wie Ihre Produktionsdaten aus. Aus diesem Grund sage ich, verwenden Sie gesunden Menschenverstand, um Probleme proaktiv zu vermeiden, aber konzentrieren Sie Ihre begrenzten Ressourcen darauf, die Dinge zu optimieren, die sich als echte Probleme herausstellen, anstatt Zeit und Geld aufzuwenden, die Sie wahrscheinlich nicht für die Suche nach imaginären oder potenziellen Problemen haben.

Joel Brown
quelle
3
Ich denke nicht, dass das überhaupt widersprüchlich ist. Niemand schlägt vor, alles präventiv zu optimieren, aber Sie sollten alles testen und die Dinge optimieren, bei denen offensichtlich ist, dass sie Probleme in der Produktion verursachen können / werden. Dies unterscheidet sich erheblich von der Optimierung von Code ohne Daten und davon, herauszufinden, was nach der Übermittlung des Codes fehlerhaft / langsam ist. Natürlich gibt es eine Linie - wie Sie bereits erwähnt haben, müssen Sie irgendwann etwas liefern. Aber ich denke, es gibt eine gute Balance, in der Sie vermeiden können, etwas zu liefern, das in Bezug auf die Leistung schlecht ist .
Aaron Bertrand
4
Aaron, stimmte zu - liefern Sie niemals etwas, das die Leistung beeinträchtigt, und laden Sie nicht auf und bauen Sie etwas auf, ohne über Leistung und Skalierbarkeit nachzudenken. "Zweimal messen, einmal schneiden" steht auf den Autoaufklebern der Programmierer genauso wie auf den Tischlern. Gleichzeitig hatte ich das Gefühl, dass der allgemeine Tenor der anderen Antworten "proaktiv> reaktiv" war, und ich hatte das Gefühl, dass die Meinung unterrepräsentiert war, dass "Realität == reaktiv", und der Schlüssel ist, nicht so viel Zeit zu verschwenden proaktiv sein, dass Sie keine Zeit oder kein Geld mehr haben, um mit den harten, oft unvorhersehbaren Realitäten umzugehen.
Joel Brown
15

Sie werden 3 Arten von Tuning durchführen, 1 reaktives und 2 proaktives.

Reaktiv

Aus heiterem Himmel verursacht eine Abfrage Probleme. Dies kann an einem Anwendungsfehler oder einer Anwendungsfunktion liegen, an einer Tabelle, die die Erwartungen übertrifft, an einem Anstieg des Datenverkehrs oder daran, dass das Abfrageoptimierungsprogramm "kreativ" wird. Dies könnte ein nächtliches Problem sein, bei dem es um nichts geht, oder es könnte eine Reaktion auf die Langsamkeit des Systems sein, die nicht kritisch ist. In jedem Fall besteht der bestimmende Charakter des reaktiven Tunings darin, dass Sie bereits ein Problem haben . Natürlich möchten Sie so wenig wie möglich davon machen. Welches bringt uns zu ...

Proaktiv

Typ 1: Routinewartung

Abhängig davon, wie oft sich Ihr Schema ändert und wie schnell Ihre Daten wachsen, sollten Sie nach einem bestimmten Zeitplan alle paar Monate oder Wochen die Ausgabe der Leistungsanalysetools Ihrer Datenbank überprüfen (z. B. AWR-Berichte für Oracle-DBAs). Sie suchen nach beginnenden Problemen, d. H. Nach Dingen, die auf dem Weg zu einer reaktiven Optimierung sind, sowie nach niedrig hängenden Früchten, die wahrscheinlich nicht bald Probleme verursachen, die sich jedoch mit geringem Aufwand in der Hoffnung verbessern lassen, weitestgehend zu verhindern -Zukunftsprobleme. Wie viel Zeit Sie dafür aufwenden sollten, hängt davon ab, wie viel Zeit Sie haben und wofür Sie es sonst ausgeben könnten, aber der optimale Betrag ist niemals Null. Sie können jedoch leicht den Betrag reduzieren, den Sie ausgeben müssen, indem Sie mehr von ...

Typ 2: Richtiges Design

Knuths Mahnung gegen "vorzeitige Optimierung" ist weithin bekannt und wird gebührend respektiert. Aber die richtige Definition von "vorzeitig" muss verwendet werden. Einige Anwendungsentwickler neigen dazu, wenn sie ihre eigenen Abfragen schreiben dürfen, die allererste Abfrage zu übernehmen, auf die sie treffen, die logisch korrekt ist, und achten überhaupt nicht auf Leistung, Gegenwart oder Zukunft. Oder sie testen mit einem Entwicklungsdatensatz, der für die Produktionsumgebung einfach nicht repräsentativ ist (Tipp: Tun Sie dies nicht! Entwickler sollten zum Testen immer Zugriff auf realistische Daten haben.). Der Punkt ist, dass der richtige Zeitpunkt für die Optimierung einer Abfrage der Zeitpunkt ist, an dem sie zum ersten Mal bereitgestellt wird, und nicht, wenn sie in einer Liste von SQL mit schlechter Leistung angezeigt wird und definitiv nicht, wenn sie ein kritisches Problem verursacht.

Was wäre also eine vorzeitige Optimierung im DBA-Land? Ganz oben auf meiner Liste würde ich die Normalisierung opfern, ohne die Notwendigkeit zu demonstrieren. Sicher, Sie könnten eine Summe für eine übergeordnete Zeile beibehalten, anstatt sie zur Laufzeit aus den untergeordneten Zeilen zu berechnen, aber müssen Sie das wirklich tun? Wenn Sie Twitter oder Amazon sind, können strategische De-Normalisierung und Vorberechnung Ihre besten Freunde sein. Wenn Sie eine kleine Buchhaltungsdatenbank für 5 Benutzer entwerfen, muss die richtige Struktur zur Erleichterung der Datenintegrität oberste Priorität haben. Weitere vorzeitige Optimierungen sind ebenfalls prioritär. Verbringen Sie keine Stunden damit, eine Abfrage zu optimieren, die einmal am Tag ausgeführt wird und 10 Sekunden dauert, auch wenn Sie glauben, dass Sie sie auf 0,1 Sekunden reduzieren können. Vielleicht haben Sie einen Bericht, der 6 Stunden täglich läuft, Aber planen Sie es als Batch-Job, bevor Sie Zeit in die Optimierung investieren. Investieren Sie nicht in eine separate replizierte Echtzeit-Berichtsinstanz, wenn Ihre Produktionslast nie über 10% schwankt (vorausgesetzt, Sie können die Sicherheit verwalten).

Indem Sie anhand realistischer Daten testen, fundierte Schätzungen zu Wachstums- und Datenverkehrsmustern (plus Toleranzen für Spitzen) vornehmen und Ihr Wissen über die Optimierungsprobleme Ihrer Plattform anwenden, können Sie Abfragen bereitstellen, die nicht nur jetzt, sondern auch in Zukunft (nahezu) optimal ausgeführt werden und unter nicht idealen Bedingungen. Wenn Sie die richtigen Techniken anwenden, kann die Abfrageleistung genau vorhergesagt und optimiert werden (im Sinne, dass jede Komponente so schnell ist, wie sie sein muss).

(Und wenn Sie schon dabei sind, lernen Sie Statistiken! )

Noah Yetter
quelle
Das richtige Design bietet 95% Leistung und Skalierbarkeit.
Mark Stewart
6

In einer perfekten Welt würde die gesamte Abstimmung proaktiv in der Entwurfsphase erfolgen, und nichts wäre reaktiv, aber die Welt ist nicht perfekt. Sie werden feststellen, dass Testdaten manchmal nicht repräsentativ sind, Testfälle übersehen wurden, das Laden unerwartet anders verläuft und es Fehler gibt, die Leistungsprobleme verursachen. In diesen Situationen ist möglicherweise eine reaktive Abstimmung erforderlich. Dies bedeutet jedoch nicht, dass eine reaktive Abstimmung bevorzugt wird. Das Ziel sollte immer sein, diese im Vorfeld einzuholen.

Ihre Planung für eine nachträgliche Optimierung ist sehr pragmatisch. Beim Testen sollten Sie die erwarteten Zeiten und den erwarteten Durchsatz dokumentieren und zuweilen eine Analyse einbauen, die Sie darüber informiert, wenn die Produktionsprozesse nicht den Designspezifikationen entsprechen. Auf diese Weise können Sie möglicherweise im Voraus erkennen, welcher Code angepasst werden muss. Sie können dann nicht nur feststellen, worin das Problem besteht, sondern auch, warum Sie es in der Entwurfs- / Testphase nicht erkannt haben.

Leigh Riffel
quelle
5

Leistungstests waren für mich schon immer Teil des Entwicklungsprozesses. Möchten Sie diese Tabelle ändern, diesen Bericht ändern und diese Funktion hinzufügen? Im Rahmen von Tests stellen Sie sicher, dass Sie die Einzel - und Gesamtleistung mit bekannten Baselines und / oder mit den Anforderungen vergleichen können (z. B. einige Berichte werden im Hintergrund ausgeführt oder auf andere Weise automatisiert, also die Leistung - oder besser gesagt die Geschwindigkeit - jeder einzelnen Abfrage in der Datenbank System ist nicht immer die oberste Priorität).

IMHO, dies sollte überhaupt kein reaktiver Prozess sein - Sie sollten niemals warten, bis eine Änderung dazu führt, dass ein Leistungsproblem in der Produktion darauf reagiert. Wenn Sie die Änderung in dev / test usw. vornehmen, sollten Sie diese Änderungen mit ähnlichen Daten auf ähnlicher Hardware mit denselben Apps und ähnlichen Verwendungsmustern testen. Lassen Sie sich von diesen Änderungen nicht überraschen. Dies ist fast immer der Fall, wenn es nicht zweckmäßig ist, einen Tag für die Abstimmung aufzuwenden - das Budget für diese Abstimmungszeit muss im Voraus festgelegt werden.

Aaron Bertrand
quelle