Wiem, co robi NewID(), po prostu próbuję zrozumieć, jak pomogłoby to w losowym wyborze. Czy to jest, że (1) instrukcja select wybierze WSZYSTKO z mytable, (2) dla każdego wybranego wiersza, dopisz unikalny identyfikator wygenerowany przez NewID(), (3) posortuje wiersze według tego unikatowego identyfikatora i (4) wybierze pierwsze 100 z posortowanej listy ?
Tak. jest to prawie dokładnie poprawne (poza tym, że niekoniecznie trzeba sortować wszystkie wiersze). Możesz to zweryfikować, patrząc na rzeczywisty plan wykonania.
SELECT TOP 100 *
FROM master..spt_values
ORDER BY NEWID()
Operator obliczeń skalarnych dodaje NEWID()
kolumna dla każdego wiersza (2506 w tabeli w moim przykładowym zapytaniu), a następnie wiersze w tabeli są sortowane według tej kolumny z wybranymi 100 górnymi.
SQL Server nie musi w rzeczywistości sortować całego zestawu od pozycji 100 w dół, więc używa TOP N
operator sortowania, który próbuje wykonać całą operację sortowania w pamięci (dla małych wartości N
)