Ich möchte eine ziemlich große Tabelle (Millionen von Zeilen) abfragen, die einen Startwert liefert, so dass eine zufällige Reihenfolge garantiert wird - aber eine, die über mehrere Abfragen stabil bleibt, solange der selbe Startwert verwendet wird.Performante stabile zufällige Sortierung in SQL Server?
Das Beste, was ich mit so habe kommen weit ist
SELECT TOP n *
FROM tbl t
ORDER BY t.int_column % seed, t.int_column
Ist dies ein brauchbarer Ansatz, sowohl aus anwendungstechnischer Sicht und eine etwas gleichmäßige Verteilung von Ergebniszeilen über verschiedene Samen?
Edit:
Für Kontext, die stabile Art wegen mehrerer gebraucht wird - möglicherweise verschachtelte - WHERE NOT IN
Abfragen, die auf dem gleichen Datenbestand arbeiten; z.B.
SELECT *
FROM tbl t
WHERE t.some_criteria = 'some_value'
AND t.id NOT IN
(
SELECT TOP n t.id
FROM tbl t
WHERE t.some_other_criteria = 'some_other_value'
ORDER BY t.int_column % seed, t.int_column
)
AND t.id NOT IN
(
# etc.
)
Wenn die Reihenfolge der Subselects ist zufällig, aber nicht stabil (d.h. NEWID()
, TABLESAMPLE()
) schwanken die Ergebniszeilen wild zwischen Ausführungen.
Wo werden die Daten konsumiert? Wenn Sie Daten nicht an eine andere gespeicherte Prozedur oder einen anderen In-Database-Code übergeben, ist das Ordnen von Zeilen nach nicht-trivialen Kriterien ein Problem auf View-Ebene und sollte nicht in Ihrem Datenbankcode, sondern in Ihrer Anwendung enthalten sein Code. – Dai
@Dai - große Frage. Bitte sehen Sie meine Bearbeitung. – vzwick
Sie werden immer alle Datensätze sortieren, die die Kriterien erfüllen, was ziemlich viel ist. Sind Sie sicher, dass Sie alle diese "NOT IN" -Klauseln benötigen? Vielleicht können Sie die Abfrage etwas vereinfachen. Was genau willst du erreichen? –