ROW_NUMBER Ohne BESTELLUNG DURCH
Habe ich auf "Zeile hinzufügen" Nummer in meine vorhandene Abfrage, so dass ich verfolgen kann, wie viele Daten Hinzugefügt worden ist, in Redis. Wenn meine Abfrage fehlgeschlagen, so kann ich beginnen, dass keine Zeile, die aktualisiert wird, in eine andere Tabelle.
Abfrage zum abrufen von Daten zu starten, nachdem die 1000 Zeilen aus der Tabelle
SELECT * FROM (SELECT *, ROW_NUMBER() OVER (Order by (select 1)) as rn ) as X where rn > 1000
Abfrage ist in Ordnung. Wenn jede Möglichkeit, ich kann die Zeile nicht ohne Verwendung von order by.
Was ist select 1
hier?
Ist die Abfrage optimiert, oder kann ich es durch andere Wege. Bitte geben Sie die bessere Lösung.
SELECT 1
bedeutet zufälliger Reihenfolge - es ist sicher zu verwendet. Sie dürfen nicht verwendet werden ROW_NUMBER
ohne ORDER BY
- Klausel. Es ist perfekt gesichert, es zu benutzen.InformationsquelleAutor lucy | 2017-05-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine Notwendigkeit zur Sorge über die Angabe von Konstanten im
ORDER BY
Ausdruck. Das folgende ist zitiert aus dem Microsoft SQL Server 2012 High-Performance T-SQL Using Window Functions geschrieben vonItzik Ben-Gan
(es war verfügbar für den kostenlosen download von Microsoft Kostenlose e-Bücher Website):Den oben bedeutet, dass bei Verwendung von Konstanten die Bestellung wird nicht durchgeführt. Ich empfehle, das Buch zu Lesen als
Itzik Ben-Gan
beschreibt, in die Tiefe, wie die Fenster-Funktionen arbeiten und optimieren der verschiedenen Fälle, in denen Sie verwendet werden.Nein, die Reihenfolge nicht die gleiche bleiben bei jeder Ausführung der query. Mit
(SELECT constant)
bedeutet, dass es KEINE ORDNUNG gibt. Wählen Sie ein bestimmtes Menge der Daten), können Sie die Abfrage ausführen 1 million mal und wieder die selben Daten, aber es gibt keine Garantie für diese. Ohne spezifische Ordnung, das Ergebnis ist nicht deterministisch.Dank gotqn für klar meine Zweifel
InformationsquelleAutor gotqn
Versuchen nur
order by 1
. Lesen Sie die Fehlermeldung. Dann wieder denorder by (select 1)
. Klar, dass wer auch immer dies schrieb, hat irgendwann die Fehlermeldung Lesen und dann entschieden, dass das Recht, was zu tun ist, trick das system nicht in einen Fehler auslösen, anstatt die Verwirklichung der fundamentalen Wahrheit, dass der Fehler war zu versuchen, um Sie zu warnen.Tabellen haben keine inhärente Reihenfolge. Wenn Sie möchten, dass einige form der Bestellung können Sie sich verlassen, es ist bis zu Ihnen, um genug deterministischen Ausdruck(s) zu jeder
ORDER BY
- Klausel, so dass jede Zeile eindeutig identifiziert und bestellt werden.Alles andere, einschließlich trickst das system in den nicht-emittierenden Fehler, ist Hoffnung, dass das system tun Sie etwas vernünftiges, ohne die Werkzeuge bereitgestellt, um Sie zu gewährleisten, dass es etwas tut, sinnvoll ist - ein gut angegeben
ORDER BY
- Klausel.Ich teilweise nicht einverstanden mit der Aussage, "Tabellen haben keine inhärente Reihenfolge." ich habe festgestellt (bei der Auswahl aus einer Tabelle) es wird, wieder in seine Datensätze, die mit den Clustered-Index, Um zu jeder Zeit. Jetzt starten Sie das verknüpfen von Tabellen und machen Sie eine komplexere Abfrage, dann denke ich, die Standard-Bestellung können Sie bis zu welchen Weg die Query-Optimizer braucht. BTW: Der Fragesteller ist nicht Fragen über das verlassen der Order-By-Klausel alle zusammen. Man könnte noch eine haben, Sie wollte nur wissen, ob es sein könnte, unspezifiziert in die
Row_Number()
Ausdruck, der es kann:ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
es ist ein Thema, wurde zum Tod. Es gibt keine inhärente Benutzer beobachtbare Ordnung. Oft eine Auswahl aus einer einzelnen Tabelle, Folgen Sie den gruppierten index, um SQL Server bietet keine Garantie, dass es der Fall ist. Auch in diesem Fall, obwohl, können Sie am Ende mit einem Karussell-scan - Ihre Abfrage piggy-backs auf eine andere Abfrage, die bereits begonnen hat, einen table scan. Die Abfrage startet immer die Ergebnisse von der Mitte der Tabelle, weil das ist, wo der scan erfolgte und dann starten Sie einen zweiten scan zu beenden off. Aus, um die Ergebnisse auch nur mit den gruppierten index definiert.
Wow, ich hatte keine Ahnung. Vielen Dank für die super-informative Antwort! Nach all diesen Jahren, fühle ich mich wie ein newb wieder.
InformationsquelleAutor Damien_The_Unbeliever
Können Sie jedes literal mit dem Wert
ex
etc
Finden Sie diese weitere Informationen
https://exploresql.com/2017/03/31/row_number-function-with-no-specific-order/
jedes mal wählen Sie 0, geben Sie die gleiche Reihenfolge, wenn ich die Abfrage ausführen?
InformationsquelleAutor Madhivanan