Erläuterung der Tabelle sqlite_stat1

8

Ich versuche zu diagnostizieren, warum eine bestimmte Abfrage gegenüber SQLite langsam ist. Es scheint viele Informationen zu zu geben, wie der Abfrageoptimierer funktioniert , aber kaum Informationen darüber, wie man Probleme tatsächlich diagnostiziert.

Insbesondere wenn ich die Datenbank analysiere, erhalte ich die erwartete Tabelle sqlite_stat1, aber ich weiß nicht, was die Stat-Spalte mir sagt. Eine Beispielzeile ist:

%Vor%

Was bedeutet "25112 1 1 1 1" eigentlich?

Als weitere Frage: Hat jemand gute Ressourcen für die besten Tools und Techniken zur Diagnose der SQLite-Abfrageleistung?

Danke

    
Kent Boogaart 16.03.2010, 16:33
quelle

4 Antworten

5

von analyze.c:

%Vor%     
Peter Hizalev 23.03.2010, 22:37
quelle
1

Außerdem bedeutet I = (K + D-1) / D: K ist die Gesamtzahl der Zeilen und D ist für jede Spalte ein bestimmter Wert. Wenn Sie also eine Tabelle mit CREATE TABLE TEST (C1 INT, C2 TEXT, C3 INT, C4 INT); erstellen und Sie erstellen einen Index wie CREATE INDEX IDX on TEST(C1, C2)

Dann können Sie manuell einfügen oder sqlite automatisch die Tabelle sqlite_stat1 wie folgt aktualisieren: "TEST" - & gt; Tabellenname, "IDX" - & gt; INDEX NAME, "10000 1 1000", HIER, 10000 ist die Gesamtzahl der Zeilen in TABLE TEST, 1 bedeutet, für Spalte C1 scheinen alle Werte verschieden zu sein, das klingt wie C1 ist so etwas wie IDs oder was auch immer, 1000 bedeutet C2 hat, wie Sie wissen, weniger eindeutigen Wert, je höher der Wert ist, desto weniger unterschiedliche Werte bezieht sich der Index auf die spezifische Spalte.

Sie können ANALYZE ausführen oder die Tabelle manuell aktualisieren. (Besser, mach das erste).

Wofür verwendet der Wert? sqlite verwendet diese Statistiken, um den besten Index zu finden, den sie verwenden möchten. Sie können CREATE INDEX IDX2 ON TEST(C2)" AND the value in stat1 table is "10000 1 und CREATE INDEX IDX1 ON TEST(C1)" with value "10000 100"; berücksichtigen. Angenommen, wir haben keinen Index-IDX, den wir vorher definiert haben, als Sie ihn ausgegeben haben SELECT * FORM TEST WHERE C1=? AND C2=? , sqlite wählt IDX2, aber nicht IDX1, warum? Es ist einfach, da IDX2 die Abfrageergebnisse minimieren kann, aber IDX1 nicht.

Löschen?

    
Curt Hu 07.03.2011 06:42
quelle
1

Denken Sie daran, dass ein Index aus mehr als einer Spalte einer Tabelle bestehen kann. Im Fall von "25112 1 1 1 1" würde dies als ein zusammengesetzter Index beschrieben, der aus 4 Spalten einer Tabelle besteht. Die Zahlen bedeuten wie folgt:

  • 25112 ist eine Schätzung der Gesamtzahl der Zeilen im Index
  • Die zweite Ganzzahl (die erste "1") ist eine Schätzung der Anzahl der Zeilen, die in der ersten Spalte des Index denselben Wert haben.
  • Die dritte ganze Zahl (die zweite "1") ist eine Schätzung der Anzahl der Zeilen, die den gleichen Wert für die ersten ZWEI Spalten des Indexes haben. Es ist NICHT die "Unterscheidbarkeit" von Spalte 2.
  • Die vierte Ganzzahl (die dritte "1") ist eine Schätzung der Anzahl der Zeilen, die für die ersten drei Spalten des Index dieselben Werte haben.
  • Gleiche Logik für die letzte Ganzzahl ..

Die letzte ganze Zahl sollte immer eins sein. Betrachten Sie eine Tabelle mit zwei Zeilen und zwei Spalten mit einem zusammengesetzten Index aus Spalte1 + Spalte2. Die Daten sind die Tabelle ist:

  1. Apfel, rot
  2. Apfel, grün

Die Statistiken würden wie "2 2 1" aussehen. Das heißt, es gibt 2 Zeilen im Index. Es gibt zwei Zeilen, die zurückgegeben würden, wenn nur spalte1 des Indexes (Apple und Apple) verwendet würde. Und 1 eindeutige Zeile, die mit column1 + column2 zurückgegeben werden würde (Apple + Red ist einzigartig von Apple + Green)

    
Eddie 12.07.2016 01:15
quelle
0

Führen Sie einfach EXPLAIN QUERY PLAN + YOUR SQL STATEMENT aus. Sie sollten herausfinden, ob die in der Anweisung angegebenen Tabellen den gewünschten Index verwenden. Wenn nicht, versuchen Sie, die SQL neu zu schreiben, wenn ja, herauszufinden, ob Sie den richtigen Index haben benutzen. Weitere Informationen finden Sie unter www.sqlite.org

    
Curt Hu 07.03.2011 02:20
quelle

Tags und Links