Какое решение лучше для получения случайного набора записей из БД? - PullRequest
4 голосов
/ 02 марта 2010

Я хочу получить несколько случайных записей из БД. Для этого есть два решения:

1 - Использование TABLESAMPLE для получения данных из БД напрямую.

2 - написать метод В моем приложении для этого. В этом методе мы генерируем несколько случайных чисел и получаем такие данные:

select * from db where ID = @RandomNumber

если этот идентификатор не существует, я передаю новый номер.

Какой из них имеет лучшую производительность?

Ответы [ 4 ]

3 голосов
/ 02 марта 2010

Согласно документации для TABESAMPLE , вы не должны использовать ее, если вы «действительно хотите получить образец отдельных строк»:

Если вы действительно хотите случайную выборку отдельные строки, измените ваш запрос на отфильтровывать строки случайным образом, а не используя TABLESAMPLE. Например, следующий запрос использует NEWID функция для возврата примерно одного процентов строк Sales.SalesOrderDetail table:

 SELECT  * 
 FROM    Sales.SalesOrderDetail
 WHERE   0.01 >= CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float)
         / CAST (0x7fffffff AS int)

Столбец SalesOrderID включен в выражение CHECKSUM так, чтобы NEWID () оценивается один раз в строке достичь выборки для каждого ряда. Выражение CAST(CHECKSUM(NEWID(),> SalesOrderID) & 0x7fffffff AS float / CAST(0x7fffffff AS int) оценивает случайное значение с плавающей запятой между 0 и 1.

В любом случае, учитывая потенциально бесконечное количество запросов, которые вы можете сделать, передав @RandomNumber (теоретически первые 1000 запросов, которые вы делаете, могут ничего не возвращать), лучший способ - ограничить набор результатов на сервере.

2 голосов
/ 02 марта 2010

попробуйте это:

SELECT TOP 1 * FROM db
ORDER BY NEWID()

функция NewID сгенерирует значение UniqueIdentifier, и оно будет случайным. Источник: SQL для выбора случайной строки из таблицы базы данных

1 голос
/ 02 марта 2010

Я бы использовал TABLESAMPLE, так как он позволяет очень легко генерировать данные выборки. Я ожидаю, что это будет более эффективно, так как вы вызываете только один кусок SQL.

, например

USE AdventureWorks ;
GO
SELECT FirstName, LastName
FROM Person.Contact 
TABLESAMPLE (10 PERCENT) 

В другом примере вам придется много раз звонить select * from db where ID = @RandomNumber.

Если вы после отдельных строк, то я бы использовал другой метод, случайную форму TOP 1 и т. Д.

0 голосов
/ 02 марта 2010

Рекомендую прочитать пост о различных методах, чтобы получить случайную строку из таблицы . Он основан на PostgreSQL, но я уверен, что 90% относится и к SQL Server.

Конечно, наиболее гибкое и наиболее эффективное решение может быть достигнуто путем написания хранимой процедуры.

Стоимость (а значит: лучшая производительность) получения действительно случайной выборки зависит от данных (типа данных, статистики и распределения, включая разреженность).

...