Выборка случайных записей
Достаточно распространенная задача с выборкой заданного количества случайных записей во всех СУБД делается примерно одинаково, но синтаксис немного отличается. Вот, собрал для заметки способы получения 10 случайных записей в самых популярных БД.
SQL Server
SELECT TOP 10 Title, Text FROM BlogPosts ORDER BY NEWID()
Oracle
SELECT Title, Text FROM (SELECT Title, Text FROM BlogPosts ORDER BY dbms_random.value) WHERE rownum <= 10
MySQL
SELECT Title, Text FROM BlogPosts ORDER BY RAND() LIMIT 10
DB2
SELECT Title, Text, RAND() as IDX FROM BlogPosts ORDER BY IDX FETCH FIRST 10 ROWS ONLY
Comments
Anonymous
April 25, 2008
Если функции RAND - это функция равномерного распределения на заданном интервале, то NEWID() - это GUID, распределение которого вряд ли является равномерным. Хотя, конечно, надо смотреть алгоритм формирования GUID-а. По-любому в MSSQL есть функция RAND() для равномерного распределения. С ней запрос будет выглядеть не короче MySQL.Anonymous
April 25, 2008
А дело не в длине запроса и не в равномерности распределения. Задача - выбрать несколько строк случайным образом. С GUID получается вполне неплохо.Anonymous
April 30, 2008
В случае большых таблиц, такой метод использования RAND() может создать проблемы, связанные с производительностью (по крайнер мере, в MySQL), т.к. перед применением "рандомизации" СУБД должна будет пройтись по всем записям таблицы (или же по полному индексному дереву, если это возможно). Альтернативой данному решению есть генерация случайного числа в програмном коде (или же вызов RAND() едиственный раз перед выполнением запроса), для определения id записи для выбора. Для избежания проблем, связанных с пустыми промежутками между id, то есть, с удаленными записями, можно использовать запрос вида: SELECT TOP 1 Title, text FROM BlogPosts WHERE ID >= @RandomValue ORDER BY ID У данного подхода тоже есть недостатки (неравномерное распределение вероятностей). Да и запрос для получения N записей одним махом написать по-сложнее. Возможно вас заинтересует, довольно обширная статья по данному вопросу (на примере MySQL): http://jan.kneschke.de/projects/mysql/order-by-rand