SQL Large Table wählt eine zufällige Zeilenstrategie aus

8

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.

  1. Erstellen Sie ein neues Feld namens 'RandomSort' als UniqueIdentified

  2. Am Ende jeder Stunde / Tag wird Update RandomSort = NewID() für die gesamte Tabelle

  3. verwendet
  4. Jedes Mal, wenn ich abfragen muss, kann ich eine Top 10 Order by RandomSort

Es erledigt den Job (besser als ORDER BY NewID ), aber nicht sicher, ob dies bisher die beste Vorgehensweise ist?

    
Lasker 26.05.2015, 07:26
quelle

1 Antwort

3

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:

%Vor%

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).

    
Mitch Wheat 26.05.2015, 07:34
quelle

Tags und Links