Mit limit in sqlite SQL-Anweisung in Kombination mit der order by-Klausel
Werden folgende zwei SQL-Anweisungen erzeugen immer wieder das gleiche Ergebnis einstellen?
1. SELECT * FROM MyTable where Status='0' order by StartTime asc limit 10
2. SELECT * FROM (SELECT * FROM MyTable where Status='0' order by StartTime asc) limit 10
- Diese Frage ist speziell für SQLite?
- Die Frage ist in Erster Linie auf SQLite. Aber wenn eine Antwort sagt mir auch etwas über die Verwendung der Oracle -
rownum
in der gleichen Situation, würde ich dankbar sein.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Keine. Erstens, weil die
StartTime
Spalte möglicherweise nichtUNIQUE
Einschränkung. So, auch die erste Abfrage kann nicht immer zum gleichen Ergebnis führen - mit sich selbst!Zweitens, selbst wenn es keine zwei Zeilen mit der gleichen Startzeit, die Antwort ist immer noch negative.
Die erste Anweisung wird immer um auf
StartTime
und produzieren die ersten 10 Zeilen. Die zweite Abfrage kann zum gleichen Ergebnis führen, aber nur mit einem primitiven Optimierer, die nicht verstehen, dass dieORDER BY
in der Unterabfrage ist überflüssig. Und nur, wenn der Ausführungsplan enthält diese Bestellung phase.Die SQLite-query-optimizer kann (im moment) nicht sehr hell sein und genau das zu tun (keine Ahnung, wirklich, wir werden zu prüfen haben den source-code von SQLite*). So kann es vorkommen, dass die beiden Abfragen produzieren identische Ergebnisse die ganze Zeit. Dennoch ist es nicht eine gute Idee, um auf Sie verlassen. Man weiß nie, was änderungen werden in einer zukünftigen version von SQLite.
Ich denke, es ist keine gute Praxis zu verwenden
LIMIT
ohneORDER BY
in jedem DBMS. Es mag nun funktionieren, aber man weiß ja nie, wie lange diese Abfragen von der Anwendung verwendet werden. Und Sie sind möglicherweise nicht rund um SQLite aktualisiert wird oder das DBMS geändert wird.(*) @Gareth link liefert den Ausführungsplan was darauf hindeutet, dass die aktuellen SQLite code ist dumm genug, um ausführen die redundante bestellen.
order by
in der zweiten Abfrage ist überflüssig. Könnten Sie bitte erklären?ORDER BY
im abgeleiteten Teil-und/oder Ansichten.rownum
.Ja, aber die Bestellung Unterabfragen ist wohl eine schlechte Angewohnheit, in zu erhalten. Könnte man zweckmäßigerweise eine weitere hinzufügen
ORDER BY
außerhalb der Unterabfrage in Ihrem zweiten Beispiel, z.B.SQLite-immer noch führt die
ORDER BY
auf die innere Abfrage, Sortieren, bevor Sie Sie wieder in der äußeren Abfrage. Eine unnötige Verschwendung von Ressourcen.Ich getan habe, ein SQL Fiddle zu demonstrieren, so können Sie die Ausführungspläne für jeden.