Dies ist eine bekannte Frage, aber die beste Lösung, die ich gefunden habe, ist etwa:
SELECT TOP N *
FROM MyTable
ORDER BY Id DESC
Ich habe eine Tabelle mit vielen Zeilen. Es ist nicht möglich, diese Abfrage zu verwenden, da dies viel Zeit in Anspruch nimmt. Wie kann ich also die letzten N Zeilen auswählen, ohne ORDER BY zu verwenden?
BEARBEITEN
Entschuldigung, doppelte Frage von diesem
id
indiziert, wird dieser Index nur umgekehrt gescannt und nach den ersten 5 Zeilen angehalten. Wenn es nicht indiziert ist, muss eineTOP N
Sortierung durchgeführt werden. Dies wird nicht schlimmer sein als jede andere Art, es zu tun. Es sortiert nicht die gesamte Tabelle (obwohl es die gesamte Tabelle scannen müsste)Antworten:
Sie können dies auch mit der Funktion ROW NUMBER BY PARTITION tun. Ein gutes Beispiel finden Sie hier :
quelle
Sie können SQL Server veranlassen, die letzten N Zeilen mit diesem SQL auszuwählen:
quelle
Ich habe den Code von JonVD getestet, fand ihn aber sehr langsam, 6s.
Dieser Code dauerte 0s.
quelle
OrderDate
indiziert haben, sollte es im Wesentlichen gleich schnell sein, die ersten oder letzten N Zeilen einer Abfrage auszuwählen . Mir ist klar, dass es eine Chance gibt, dieOrderDate
gut mit der eingefügten Reihenfolge korreliert, aber das ist bestenfalls ein Nebeneffekt und erfordert immer noch einen Tabellenscan, oder? (Und ich glaube nicht, dass es das beantwortet, worauf das OP als besser formulierten Betrüger ihrer Frage hinweist : dh ohne zu sortieren)Wenn Sie die letzte Anzahl von Zeilen aus einer Tabelle auswählen möchten.
Die Syntax wird wie folgt sein
Diese Aussagen funktionieren aber auf unterschiedliche Weise. Danke Jungs.
Auf diese Weise können Sie die letzten 10 Zeilen erhalten, aber die Reihenfolge zeigt den absteigenden Weg
quelle
Ganz allgemein und zur Unterstützung von SQL Server ist hier
und für die Leistung ist es nicht schlecht (weniger als eine Sekunde für mehr als 10.000 Datensätze auf dem Server-Computer)
quelle
Ist "Id" indiziert? Wenn nicht, ist das eine wichtige Sache (ich vermute, es ist bereits indiziert).
Müssen Sie auch ALLE Spalten zurückgeben? Möglicherweise können Sie die Geschwindigkeit erheblich verbessern, wenn Sie nur eine kleinere Teilmenge von Spalten benötigen, die vom Index in der ID-Spalte VOLLSTÄNDIG berücksichtigt werden kann - z. B. wenn Sie in der ID-Spalte einen NONCLUSTERED-Index haben, ohne einen anderen Felder, die im Index enthalten sind, müssten dann nach dem Clustered-Index gesucht werden, damit der Rest der Spalten tatsächlich zurückgegeben wird. Dies könnte einen Großteil der Kosten der Abfrage ausmachen. Wenn es sich um einen CLUSTERED-Index oder einen NONCLUSTERED-Index handelt, der alle anderen Felder enthält, die Sie in der Abfrage zurückgeben möchten, sollte dies in Ordnung sein.
quelle
Zuerst erhalten Sie die meisten Aufzeichnungen von
Und dann :
In SQL Server 2012
In SQL Server 2008
quelle
Hier ist etwas, das Sie ohne versuchen können,
order by
aber ich denke, es erfordert, dass jede Zeile einzigartig ist.N
ist die Anzahl der gewünschten Zeilen,L
ist die Anzahl der Zeilen in der Tabelle.Wie bereits erwähnt, ist nicht definiert, welche Zeilen zurückgegeben werden.
EDIT: das ist eigentlich Hund langsam. Wirklich wertlos.
quelle
quelle
Diese Abfrage gibt die letzten N Zeilen in der richtigen Reihenfolge zurück, aber die Leistung ist schlecht
quelle
Verwenden Sie desc mit orderby am Ende der Abfrage, um die letzten Werte abzurufen.
quelle
Dies passt vielleicht nicht ganz zur Frage, aber…
OFFSET-Klausel
Mit dieser
OFFSET number
Klausel können Sie mehrere Zeilen überspringen und danach Zeilen zurückgeben.Dieser Dokumentlink ist zu Postgres; Ich weiß nicht, ob dies für Sybase / MS SQL Server gilt.
quelle
quelle
MS unterstützt LIMIT in t-sql nicht. Meistens bekomme ich nur MAX (ID) und subtrahiere dann.
Dies gibt weniger als 10 Datensätze zurück, wenn die ID nicht sequentiell ist.
quelle
Eine Technik, mit der ich die aktuellsten Zeilen in sehr großen Tabellen (über 100 Millionen oder über 1 Milliarde Zeilen) abfrage, beschränkt die Abfrage darauf, nur den letzten "N" -Prozentsatz der letzten Zeilen zu "lesen". Dies sind reale Anwendungen, zum Beispiel mache ich dies für nicht historische aktuelle Wetterdaten oder aktuelle Newsfeed-Suchen oder aktuelle GPS-Standortdatenpunktdaten.
Dies ist eine enorme Leistungsverbesserung, wenn Sie sicher wissen, dass sich Ihre Zeilen beispielsweise in den letzten TOP 5% der Tabelle befinden. Selbst wenn es Indizes in den Tabellen gibt, werden die Möglichkeiten weiter auf nur 5% der Zeilen in Tabellen mit mehr als 100 Millionen oder mehr als 1 Milliarde Zeilen beschränkt. Dies ist insbesondere dann der Fall, wenn ältere Daten Lesevorgänge auf der physischen Festplatte erfordern und nicht nur logisch im Speicher Lesevorgänge im .
Dies ist weitaus effizienter als SELECT TOP | PROZENT | LIMIT, da es nicht die Zeilen auswählt, sondern lediglich den Teil der zu durchsuchenden Daten begrenzt.
quelle
So zeigen Sie die letzten 3 Zeilen an, ohne Folgendes zu verwenden
order by
:quelle
Versuchen Sie es mit der
EXCEPT
Syntax.Etwas wie das:
quelle
Vielleicht etwas spät, aber hier ist eine einfache Auswahl, die Ihre Frage löst.
quelle