Związek ten ma ciekawe porównanie między orderby (NEWID()) i inne metody tabelach 1, 7 i 13 milionów rzędach.
Często, kiedy pytania o jak wybrać losowo wiersze są zadawane w grupach dyskusyjnych, zapytanie NEWID proponuje; jest prosty i działa bardzo dobrze na małe stoły.
SELECT TOP 10 PERCENT *
FROM Table1
ORDER BY NEWID()
Jednak kwerenda NEWID ma dużą wadę, gdy używa się go do dużych tabel. Klauzula ORDER BY powoduje, że wszystkie wiersze w tabeli są kopiowane do bazy danych tempdb, gdzie są sortowane. Powoduje to dwa problemy:
- Operacja sortowania zwykle wiąże się z wysokim kosztem. Sortowanie może korzystać z wielu dyskowych operacji we/wy i może działać przez długi czas.
- W najgorszym scenariuszu, tempdb może zabraknąć miejsca. W najlepszym scenariuszu, , tempdb może zająć dużo miejsca na dysku , które nigdy nie zostaną odzyskane bez ręcznego polecenia zmniejszania.
Potrzebny jest sposób losowego wybierania wierszy, które nie będą używać tempdb i nie będą się znacznie wolniejsze, gdy tabela będzie większa. Oto nowy pomysł, jak to zrobić:
SELECT * FROM Table1
WHERE (ABS(CAST(
(BINARY_CHECKSUM(*) *
RAND()) as int)) % 100) < 10
Podstawową ideą tego zapytania jest to, że chcemy wygenerować losową liczbę między 0 a 99 dla każdego wiersza w tabeli, a następnie wybrać wszystkie te wiersze, których losowa liczba jest mniejsza niż wartość określonego procentu. W tym przykładzie chcemy losowo wybrać około 10 procent wierszy; dlatego wybieramy wszystkie wiersze, których liczba losowa jest mniejsza niż 10.
Przeczytaj cały artykuł w dokumencie: MSDN.
MSDN ma dobry artykuł, który obejmuje wiele z tych zagadnień: [Wybór wierszy losowo z dużym stołem] (https://msdn.microsoft.com/en-us/library/cc441928.aspx) – KyleMit
Możliwy duplikat [Jak zażądać losowego wiersza w SQL?] (http://stackoverflow.com/questions/19412/how- to-request-a-random-row-in-sql) –