Dieser Link bietet einen interessanten Vergleich zwischen Orderby (NEWID ()) und anderen Methoden für Tabellen mit 1, 7 und 13 Millionen Zeilen.
Wenn in Diskussionsgruppen Fragen zur Auswahl zufälliger Zeilen gestellt werden, wird häufig die NEWID-Abfrage vorgeschlagen. Es ist einfach und funktioniert sehr gut für kleine Tische.
SELECT TOP 10 PERCENT *
FROM Table1
ORDER BY NEWID()
Die NEWID-Abfrage hat jedoch einen großen Nachteil, wenn Sie sie für große Tabellen verwenden. Die ORDER BY-Klausel bewirkt, dass alle Zeilen in der Tabelle in die Tempdb-Datenbank kopiert werden, wo sie sortiert werden. Dies verursacht zwei Probleme:
- Der Sortiervorgang ist normalerweise mit hohen Kosten verbunden. Das Sortieren kann viele Festplatten-E / A verwenden und lange ausgeführt werden.
- Im schlimmsten Fall kann tempdb nicht mehr genügend Speicherplatz haben. Im besten Fall kann tempdb eine große Menge an Speicherplatz beanspruchen, der ohne einen manuellen Verkleinerungsbefehl niemals zurückgefordert wird.
Was Sie brauchen, ist eine Möglichkeit, Zeilen zufällig auszuwählen, die kein Tempdb verwenden und nicht viel langsamer werden, wenn die Tabelle größer wird. Hier ist eine neue Idee, wie das geht:
SELECT * FROM Table1
WHERE (ABS(CAST(
(BINARY_CHECKSUM(*) *
RAND()) as int)) % 100) < 10
Die Grundidee hinter dieser Abfrage ist, dass wir für jede Zeile in der Tabelle eine Zufallszahl zwischen 0 und 99 generieren und dann alle Zeilen auswählen möchten, deren Zufallszahl kleiner als der Wert des angegebenen Prozentsatzes ist. In diesem Beispiel möchten wir, dass ungefähr 10 Prozent der Zeilen zufällig ausgewählt werden. Daher wählen wir alle Zeilen aus, deren Zufallszahl kleiner als 10 ist.
Bitte lesen Sie den vollständigen Artikel in MSDN .