Jakiś czas temu przyszło mi się zmierzyć z zadaniem wybrania losowych wierszy z tabeli pobranej z bazy MS SQL. Z racji na to, że nigdy wcześniej tego nie robiłem, zacząłem poszukiwania. Wykorzystanie w tym celu operacji na danych po stronie C# wydaje się absurdalną sprawą z racji na konieczność przekazania całej tabeli do logiki losującej to raz, a dwa C# działałby wolniej niż T-SQL na tabelach. Pora przeszukać sieć – udało mi się znaleźć kilka dyskusji traktujących o tym temacie – różne też były rozwiązania, jednakże jedno z nich okazało się strzałem w dziesiątkę. Przedstawia się ono następująco:

SELECT Kolumna1, [Kolumna2,…]

FROM NazwaTabeli

[WHERE warunek]

ORDER BY NEWID()

Proste w zrozumieniu i zastosowaniu rozwiązanie stało się lekarstwem na utrzymanie wydajności rozwiązania a także jego przejrzystości i spójności.

Żeby było ciekawiej, to w niedługim czasie okazało się, że przy realizowanym przeze mnie projekcie również jest wymagana podobna funkcjonalność z dużym naciskiem na wydajność (nieporównywalnie większym niż przy pierwszym projekcie). Na marginesie dodam, że pierwszym zadaniem w jakim przydatne mi było zastosowanie ORDER BY NEWID() była implementacja QUIZU będącego częścią konferencji Communities 2 Communities 2009.

Mam nadzieję, że ten post pomoże komuś, kto trafił na zadanie realizacji takiej funkcjonalności – jeżeli tak, to cel osiągnięty :)