it-swarm.com.de

ROW_NUMBER Ohne ORDER BY

Ich muss meiner vorhandenen Abfrage eine Zeilennummer hinzufügen, damit ich nachverfolgen kann, wie viele Daten zu Redis hinzugefügt wurden. Wenn meine Abfrage fehlgeschlagen ist, kann ich von der Zeile no ausgehen, die in einer anderen Tabelle aktualisiert wird.

Abfrage zum Datenstart nach 1000 Zeilen aus der Tabelle

SELECT * FROM (SELECT *, ROW_NUMBER() OVER (Order by (select 1)) as rn ) as X where rn > 1000

Die Abfrage funktioniert einwandfrei. Wenn irgendwie, dass ich die Reihe nicht bekommen kann, ohne Bestellung durch zu verwenden.

Was ist select 1 Hier?

Ist die Abfrage optimiert oder kann ich es auf andere Weise tun. Bitte geben Sie die bessere Lösung an.

20
lucy

Es ist nicht nötig, Konstanten im Ausdruck ORDER BY Anzugeben. Das Folgende ist aus dem Microsoft SQL Server 2012-Hochleistungs-T-SQL unter Verwendung von Fensterfunktionen zitiert, das von Itzik Ben-Gan Geschrieben wurde (es war für verfügbar) kostenloser Download von der Microsoft-Website für kostenlose E-Books:

Wie bereits erwähnt, ist eine Window-Order-Klausel obligatorisch, und SQL Server lässt nicht zu, dass die Reihenfolge auf einer Konstanten basiert, beispielsweise ORDER BY NULL. Überraschenderweise akzeptiert SQL Server einen Ausdruck, der auf einer Unterabfrage basiert, die eine Konstante zurückgibt (z. B. ORDER BY (SELECT NULL)). Gleichzeitig dekomprimiert oder erweitert der Optimierer den Ausdruck und stellt fest, dass die Reihenfolge für alle Zeilen gleich ist. Daher wird die Bestellanforderung aus den Eingabedaten entfernt. Hier ist eine vollständige Abfrage, die diese Technik demonstriert:

SELECT actid, tranid, val,
 ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rownum
FROM dbo.Transactions;

enter image description here

Beachten Sie in den Eigenschaften des Index Scan-Iterators, dass die Ordered-Eigenschaft False ist, was bedeutet, dass der Iterator nicht erforderlich ist, um die Daten in der Reihenfolge der Indexschlüssel zurückzugeben


Das oben Gesagte bedeutet, dass bei Verwendung der konstanten Reihenfolge keine Ausführung erfolgt. Ich empfehle dringend, das Buch zu lesen, da Itzik Ben-Gan Ausführlich beschreibt, wie die Fensterfunktionen funktionieren und wie verschiedene Fälle optimiert werden, in denen sie verwendet werden.

45
gotqn

Probieren Sie einfach order by 1. Lesen Sie die Fehlermeldung. Setzen Sie dann die Funktion order by (select 1) wieder ein. Erkennen Sie, dass derjenige, der dies geschrieben hat, irgendwann die Fehlermeldung gelesen und dann entschieden hat, dass es das Richtige ist, das System dazu zu bringen, keinen Fehler zu melden, anstatt die fundamentale Wahrheit zu erkennen, auf die der Fehler sie aufmerksam machen wollte.

Tabellen haben keine inhärente Reihenfolge. Wenn Sie eine Art von Reihenfolge wünschen, auf die Sie sich verlassen können, müssen Sie genügend deterministische Ausdrücke für jede ORDER BY - Klausel bereitstellen, sodass jede Zeile eindeutig identifiziert und sortiert wird.

Alles andere, einschließlich des Trickens des Systems, dass es keine Fehler ausgibt, ist in der Hoffnung dass das System etwas Vernünftiges tut, ohne die Ihnen zur Verfügung gestellten Werkzeuge zu verwenden sicherzustellen dass es etwas Vernünftiges tut - eine gut spezifizierte ORDER BY - Klausel.

Sie können einen beliebigen Literalwert verwenden

ex

order by (select 0)

order by (select null)

order by (select 'test')

etc

Weitere Informationen finden Sie hier https://exploresql.com/2017/03/31/row_number-function-with-no-specific-order/

4
Madhivanan