2009-06-07 7 views

Antwort

2

"Was ist effizienter?" Wofür?

Was ist der Kontext? Was versuchst du zu machen?

RAND() gibt einen pseudozufälligen Gleitkommawert von 0 bis 1, exklusiv zurück.

NEWID() erstellt einen eindeutigen Wert vom Typ uniqueidentifier.

0

NEWID() generiert eine GUID, die in einem uniqueidentifier Spaltentyp gespeichert wird. RAND() ist einfach eine Pseudozufallszahl (int, smallint oder tinyint). Es geht weniger um Effizienz als vielmehr um Ihre Bedürfnisse. RAND() ist nicht garantiert einzigartig, NEWID() ist.

1

newid() erzeugt nicht wirklich Zufallszahlen, es erzeugt GUIDs, die einen zufälligen Teil zu ihnen haben, und dienen ihrem Zweck gut für die zufällige Reihenfolge.

In Bezug auf die ist effizienter, wenn die Bestellung ein Faktor ist, ist es eigentlich eine größere Frage, die zufälliger ist. Standardmäßig erzeugt rand(), ohne dass es in Bezug auf die Abfrage einen Trick gibt, am Anfang der Ausführung einer Abfrage eine Zufallszahl und verwendet diese für jede Zeile. Es wird keine andere Zufallszahl für jede Zeile generiert. In einer einfachen Abfrage wird ein einfaches "ORDER BY rand()" die Ergebnisse nicht nach dem Zufallsprinzip sortieren.

Also in diesem Fall ist newid() viel besser, wenn auch nicht effizienter.

0

Nach SQL Server Plan Schätzung mit newid Sortierung() mehr zeitraubend als Rand(). Ich denke, Rand() Generation basiert auf Zeitfaktor und Wenn Sie Datensätze der Abfrage mit Rand() sortieren möchten, erhalten Ihre Datensätze gleiche Rand-Nummer und Ergebnis wird das gleiche wie zuvor sein. siehe zum Beispiel die folgenden

Select *,rand() as rnd from dbo.Products Order by rnd 

Alle Datensätze gleichen rnd Wert haben wird, weil Zufallserzeugungsfaktor ändert sich nicht während der Datensatzauswahl.