Abfragen mit TableStudio schneller machen
TableStudio misst, nicht nur rät. Empfehle niemals einen Index oder eine Neuschreibung aus dem Bauch heraus, wenn du es mit den unten stehenden Werkzeugen belegen kannst. Die meisten davon sind PostgreSQL-exklusiv; bei anderen Datenbank-Engines verwende explain_query und leite aus dem Ausführungsplan ab.
Wähle zuerst die Verbindung aus, wie im Skill für Datenbank-Workflows beschrieben. Bevorzuge die Analyse einer Datenbank mit realistischen Daten. Eine fast leere Entwicklungsdatenbank liefert irreführende Pläne.
Finden, was langsam ist
- Der Benutzer nennt eine Abfrage oder einen Endpunkt: Finde das SQL, das ausgeführt wird (aus dem Code oder dem ORM-Log), und gehe dann zu "Einzelne Anweisung diagnostizieren".
- "Warum ist die Datenbank langsam?" Rufe
slow_queriesauf. Es sortiert die Anweisungen nach Gesamtzeit auspg_stat_statements. Behalte diequery_idjeder Zeile; die anderen Werkzeuge akzeptieren sie. Falls die Erweiterung nicht installiert ist, erklärt das Werkzeug, was für die Aktivierung nötig ist; gib das weiter, anstatt sie ungefragt zu installieren. - Allgemeine Optimierung:
workload_index_advisorfindet die wenigsten Indizes, die die meiste Datenbankzeit abdecken, und listet vorhandene Indizes auf, die nie verwendet werden.
Ein Gesundheitscheck
Wenn der Benutzer fragt, was mit einer Datenbank nicht stimmt, oder eine allgemeine Überprüfung wünscht, ändere nichts und berichte:
database_health. Lies dieunavailable-Liste, bevor du zusammenfasst: Ein leeres Ergebnis mit Einträgen dort bedeutet, dass Prüfungen übersprungen wurden, nicht dass alles in Ordnung ist.database_overviewfür Größe, die größten und am stärksten beanspruchten Tabellen sowie Verbindungszahlen.schema_issues(ohnetable) für Designprobleme in der gesamten Datenbank.
Setze die wichtigsten Erkenntnisse an den Anfang, in verständlicher Sprache: Was das Problem ist, was es kostet, wenn es ignoriert wird, und die Lösung. Füge das verify_sql jeder Erkenntnis bei, damit der Benutzer die Zahl überprüfen kann, sowie die lock_impact-Angabe jeder Lösung. Biete an, die vom Benutzer ausgewählten Lösungen über "Ausliefern" umzusetzen.
Einzelne Anweisung diagnostizieren
optimize_querymit dem SQL (und derquery_id, falls es vonslow_queriesstammt). Für eine schreibgeschützte Anweisung übergibanalyze: true, damit die gemessenen Prüfungen laufen können. Es wird einmal innerhalb einer zurückgerollten Transaktion ausgeführt. Es meldetalready_fast, wenn es nichts zu tun gibt; sag das so, anstatt eine Verbesserung zu erfinden.- Für mehr Details verwende
explain_query(analyze: truenur für Lesezugriffe). Vergleicheactual_rowsmitestimated_rowsauf jedem Knoten. Eine große Abweichung bedeutet veraltete Statistiken (ANALYZEauf der Tabelle), was oft der eigentliche Fehler ist und kein fehlender Index. - Eine Anweisung mit Platzhaltern
$1, $2benötigt echte Werte für einen korrekten Plan.suggest_parameter_valuesfindet diese aus Verlauf, laufenden Sitzungen und Statistiken.
Die Lösung belegen
Verwende benchmark_query_variants (das Query Lab), bevor du etwas empfiehlst:
- Gib das Basis-SQL und die Kandidaten als
variantsan: ein neu geschriebenessql,hypothetical_indexes(mit hypopg geplant, nie erstellt),hide_indexesoder Planner-settings. Oder lassevariantsweg und lassefind_fastereigene Vorschläge generieren. - Es meldet Mediane über mehrere Durchläufe für jeden Parametersatz und prüft, ob jede Neuschreibung die gleichen Zeilen wie die Basisabfrage zurückgibt.
- Empfehle nur eine Variante, deren
same_rows"yes" ist. Bevorzuge die Variante inrecommendation. Zitiere die gemessenen Werte vorher und nachher, keine Prozentzahlen aus dem Bauch heraus.
Vor dem Entfernen eines Index (ungenutzt oder doppelt) führe index_what_if mit diesem Index in hide aus. Jede Anweisung, die dadurch teurer wird oder den Index heute nutzt, wäre betroffen.
Ausliefern
Indizes und Neuschreibungen durchlaufen den normalen Änderungsablauf aus dem Skill für Datenbank-Workflows:
- Indexänderungen sind Schemaänderungen. Falls das Repository ein Migrations-Tool hat, füge den Index dort hinzu. Andernfalls schlage ihn mit
stage_migrationvor und füge die gemessenen Zahlen in dierationaleein. - Bei PostgreSQL verwende
CREATE INDEX CONCURRENTLYfür jede Tabelle, die Datenverkehr sieht, und schließe es nicht in eine Transaktion ein. - Eine Abfrageneuschreibung ist eine Codeänderung: Bearbeite den Code, der die Abfrage ausführt, und erwähne das Benchmark-Ergebnis in deiner Zusammenfassung.