Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

order by newid() - wie funktioniert das?

Ich weiß, was NewID() tut, ich versuche nur zu verstehen, wie es bei der zufälligen Auswahl helfen würde. Ist es so, dass (1) die select-Anweisung ALLES aus mytable auswählt, (2) für jede ausgewählte Zeile eine von NewID() generierte eindeutige Kennung anheftet, (3) die Zeilen nach dieser eindeutigen Kennung sortiert und (4) die obersten 100 aus der sortierten Liste auswählt? ?

Ja. das ist ziemlich genau richtig (außer es muss nicht unbedingt alle sortiert werden die Reihen). Sie können dies überprüfen, indem Sie sich den tatsächlichen Ausführungsplan ansehen.

SELECT TOP 100 * 
FROM master..spt_values 
ORDER BY NEWID()

Der Compute-Skalaroperator fügt die NEWID() hinzu Spalte ein für jede Zeile (2506 in der Tabelle in meiner Beispielabfrage), dann werden die Zeilen in der Tabelle nach dieser Spalte sortiert, wobei die obersten 100 ausgewählt sind.

SQL Server muss nicht wirklich den gesamten Satz von Position 100 nach unten sortieren, also verwendet er ein TOP N Sortieroperator, der versucht, die gesamte Sortieroperation im Speicher durchzuführen (für kleine Werte von N )