Ich möchte eine zufällige Reihe aus einer sehr großen Tabelle (10 mil Datensätze) auswählen. Die am häufigsten verwendete Strategie wie RAND()
und NEWID()
scheint also nicht praktikabel zu sein.
Ich habe die folgende Strategie ausprobiert und würde gerne wissen, ob das der ideale Weg ist.
Erstellen Sie ein neues Feld namens 'RandomSort' als UniqueIdentified
Am Ende jeder Stunde / Tag wird Update RandomSort = NewID()
für die gesamte Tabelle
Top 10 Order by RandomSort
Es erledigt den Job (besser als ORDER BY NewID
), aber nicht sicher, ob dies bisher die beste Vorgehensweise ist?
Fügen Sie eine Identitätsspalte 'rowid' ( int
oder bigint
abhängig von Ihrer Tabellengröße) hinzu und erstellen Sie einen eindeutigen, nicht gruppierten Index dafür.
Die folgende Abfrage verwendet die Funktion NEWID()
, um ungefähr ein Prozent der Zeilen der Tabelle zurückzugeben:
Die Zeile rowId ist im CHECKSUM-Ausdruck enthalten, so dass NEWID () einmal pro Zeile auswertet, um eine Abtastung pro Zeile zu erreichen. Der Ausdruck CAST(CHECKSUM(NEWID(), rowid) & 0x7fffffff AS float / CAST(0x7fffffff AS int)
wird zu einem zufälligen Gleitkommawert zwischen 0 und 1 ausgewertet.
Tatsächlich könnten Sie jede Spaltenindexspalte in Ihrer Tabelle verwenden (glaube ich).
Wenn Sie nur eine zufällige Zeile auswählen möchten:
%Vor% Dies funktioniert in konstanter Zeit, vorausgesetzt die Spalte rowid
ist indiziert. Hinweis: Dies setzt voraus, dass rowid
gleichmäßig im Bereich 0..MAX(rowid)
verteilt ist, daher die vorgeschlagene Identitätsspaltenaddition. Wenn Ihr Dataset eine andere Verteilung aufweist, sind die Ergebnisse verzerrt (d. H. Einige Zeilen werden häufiger als andere ausgewählt).
Tags und Links sql-server select