Проблема с взятием n строк и пропуском m строк Entity Framework - PullRequest
0 голосов
/ 26 октября 2010

Я вычисляю данные из базы данных (~ 130 000 000 строк).

Из-за большого количества строк я выбираю 1 млн, вычисляю их, сохраняю результаты, затем выбираю еще 1 млн и т. Д.

Я использую select .. orderby .. skip m... take n...ToList()

, потому что я хочу, чтобы эти объекты были в памяти.

Когда я пропускаю 1 млн, потом 2 млн, потом 3 млн ... тогда скажем, 6 млнэто вполне нормально, но потом внезапно запрос занимает очень много времени.

У вас есть такая же проблема?

Есть ли способ заставить его работать быстрее?

Спасибо за помощьПока

Ответы [ 2 ]

0 голосов
/ 26 октября 2010

Если вы посмотрите на сгенерированный SQL, вы увидите проблему. SQL Server не имеет встроенного SKIP, поэтому Entity Framework импровизирует вокруг этого. Я объяснил некоторые детали в этом посте .

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

0 голосов
/ 26 октября 2010

Вы можете использовать Rowcount, но я не знаю, что это применимо в рамках сущности.

Таким образом, вы идете туда, где Rowcount ()> 2 000 000, а затем взять (1 000 000)

Или, если у вас есть столбец идентификатора и вы просматриваете его в порядке, добавьте условие, где для идентификатора> последний обработанный идентификатор.

Это должно быть быстрее, чем пропустить

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