beachten Sie die folgenden pgSQL Aussage:Warum dauern SQL-Anweisungen so lange, wenn sie "begrenzt" sind?
SELECT DISTINCT some_field
FROM some_table
WHERE some_field LIKE 'text%'
LIMIT 10;
Beachten Sie auch, dass some_table besteht aus mehreren Millionen Datensätzen, und dass some_field hat einen B-Baum-Index.
Warum dauert die Ausführung der Abfrage so lange (mehrere Minuten)? Was ich meine ist, warum schleift es nicht durch das Erstellen der Ergebnismenge, und sobald es 10 von ihnen erhält, das Ergebnis zurückgeben? Es sieht so aus, als wäre die Ausführungszeit gleich, unabhängig davon, ob Sie eine "LIMIT 10" hinzufügen oder nicht.
Ist das korrekt oder fehle ich etwas? Gibt es etwas, was ich tun kann, um die ersten 10 Ergebnisse zu erhalten und den Rest zu "schrauben"?
UPDATE: Wenn Sie das distinct löschen, werden die Ergebnisse praktisch sofort zurückgegeben. Ich weiß jedoch, dass viele der some_table-Datensätze bereits ziemlich eindeutig sind, und wenn ich die Abfrage ohne die eindeutige Deklaration ausführe, sind die ersten 10 Ergebnisse tatsächlich eindeutig. Ich habe auch die Where-Klausel eliminiert (sie als Faktor eliminiert). Meine ursprüngliche Frage bleibt also bestehen, warum endet sie nicht, sobald 10 Treffer gefunden wurden?
Ich würde denken, keine ORDER BY würde die Dinge beschleunigen. Wenn Sie ORDER BY haben, muss die Datenbank die zehn "niedrigsten" Zeilen zurückgeben, was das Sortieren oder alle Zeilen (oder geschickten Gebrauch eines Indexes für die Sortierspalte) beinhaltet. Jetzt müssen nur die ersten zehn (eindeutigen) Zeilen zurückgegeben werden, die es findet. – Thilo
Dies ist nicht unbedingt richtig. Ich glaube, dass dies ein neues Feature in Postgres 8.2 oder 8.3 zum Beispiel ist. Andere dbms werden sich wahrscheinlich bei der Unterstützung dieser Optimierung unterscheiden. –
Ich denke die DISTINCT Antwort ist sowieso richtig. Das * garantiert * Sie müssen viele Zeilen scannen, wobei die Verwendung einer zufälligen Reihenfolge nur eine gewisse Wahrscheinlichkeit bedeutet, dass viele Zeilen gescannt werden müssen. –