Выберите случайную выборку из sqlserver быстро - PullRequest
15 голосов
/ 16 марта 2009

У меня огромная таблица> 10 миллионов строк. Мне нужно эффективно отобрать случайную выборку 5000 из него. У меня есть некоторые константы, которые уменьшают общее количество строк, которые я ищу, до 9 миллионов.

Я пытался использовать order by NEWID (), но этот запрос займет слишком много времени, поскольку он должен выполнить сканирование таблицы всех строк.

Есть ли более быстрый способ сделать это?

Ответы [ 4 ]

21 голосов
/ 16 марта 2009

Если вы можете использовать псевдослучайную выборку и используете SQL Server 2005/2008, взгляните на TABLESAMPLE. Например, пример из SQL Server 2008 / AdventureWorks 2008, который работает на основе строк:

USE AdventureWorks2008; 
GO 


SELECT FirstName, LastName
FROM Person.Person 
TABLESAMPLE (100 ROWS)
WHERE EmailPromotion = 2;

Загвоздка в том, что TABLESAMPLE не совсем случайный, поскольку генерирует заданное количество строк на каждой физической странице. Вы не можете получить обратно ровно 5000 строк, если не ограничиваете также и TOP. Если вы используете SQL Server 2000, вам придется либо создать временную таблицу, соответствующую первичному ключу, либо сделать это с помощью метода, использующего NEWID ().

8 голосов
/ 16 марта 2009

Рассматривали ли вы использование предложения TABLESAMPLE?

Например:

select *
from HumanResources.Department tablesample (5 percent)
6 голосов
/ 23 ноября 2012

SQL Server 2000 Solution в отношении Microsoft (вместо медленного NEWID () для больших таблиц):

SELECT * FROM Table1
WHERE (ABS(CAST(
 (BINARY_CHECKSUM(*) *
  RAND()) as int)) % 100) < 10

Команда SQL Server в Microsoft поняла, что не может принять случайные выборки строк легко были распространенной проблемой в SQL Server 2000; Итак, команда обратилась к проблеме в SQL Server 2005, представив предложение TABLESAMPLE. Это предложение выбирает подмножество строк выбирая случайные страницы данных и возвращая все строки на этих страницы. Тем не менее, для тех из нас, у кого еще есть продукты, которые работают на SQL Server 2000 и нуждаются в обратной совместимости, или кому действительно нужно случайность на уровне строк, запрос BINARY_CHECKSUM очень эффективен обходной путь.

Объяснение можно найти здесь: http://msdn.microsoft.com/en-us/library/cc441928.aspx

4 голосов
/ 16 марта 2009

Да, tableSample - ваш друг (обратите внимание, что это не случайно в статистическом смысле этого слова): Образец таблицы в MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...