Эффективно выбирайте случайные строки из большого набора результатов с помощью LINQ (ala TABLESAMPLE) - PullRequest
4 голосов
/ 09 сентября 2011

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

Я использую SQL Server 2008, и правильный способ сделатьПо-видимому, это действительно предложение TABLESAMPLE .

Примечание 1. Мне не интересно популярное решение "order by NEWID ()" - оно неэффективно для больших таблиц.

Примечание 2: Поскольку мой запрос сложный, я не хочу сначала вычислять COUNT по нему, если это возможно.

Примечание 3: Поскольку набор результатов огромен, я не хочу иметьчтобы пройти его самостоятельно, например, предлагается здесь .

Кикер в том, что я использую LINQ.В частности, LINQ-To-Entities.

Существует ли LINQ-дружественный способ использования TABLESAMPLE?

Даже если прямой поддержки нет, есть ли способ, которым я могу написать большую часть своего запросав LINQ, а затем сделать небольшое количество ручного SQL для выполнения TABLESAMPLE?

Ответы [ 4 ]

0 голосов
/ 09 сентября 2011

Кажется, что то, чего я хочу достичь, вообще невозможно даже.

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

TABLESAMPLE - это только то, что можно использовать в базовых таблицах, которые входят в запрос, перед объединениями и soforth. (см. документация )

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

Спасибо всем за вклад.

0 голосов
/ 09 сентября 2011

Нечто подобное должно работать (синтаксис может быть не совсем правильным, но вы должны понять):

var rowCount = context.MyTable.Count();

int randomInt = new Random().Next(rowCount);    
var query = context.MyTable.Skip(randomInt).FirstOrDefault();
0 голосов
/ 09 сентября 2011

С EF вы можете создать определяющий запрос в вашей модели, используя конструкцию tableample. См. http://msdn.microsoft.com/en-us/library/cc982038.aspx. Кроме того, вы можете создать рандомизированное представление в вашей базе данных и затем включить это представление в модель.

0 голосов
/ 09 сентября 2011

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

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

Возможно, представляет интерес: T-SQL: генерация случайных чисел, случайная выборка и случайная выборка'Совершенство'

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