Подтвердить что ты не робот

Выбирайте случайную выборку из sqlserver быстро

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

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

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

4b9b3361

Ответ 1

Если вы можете использовать псевдослучайную выборку, и вы находитесь на 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().

Ответ 2

Вы изучали использование предложения TABLESAMPLE?

Например:

select *
from HumanResources.Department tablesample (5 percent)

Ответ 3

Решение SQL Server 2000, относящееся к 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

Да, может быть ваш друг (обратите внимание, что это не случайное в статистическом смысле слова): Таблицы в msdn