Производительность подкачки Nhibernate на большой таблице (10 000 000 строк) - PullRequest
2 голосов
/ 16 февраля 2012

У меня есть таблица, которая довольно большая, около 10 000 000 строк.Мне нужно пролистать эту таблицу из моего приложения C #.Я использую NHibernate.Я попытался использовать этот пример кода:

return session.CreateCriteria(typeof(T))
                .SetFirstResult(startId)
                .SetMaxResults(pageSize)
                .List<T>();

Когда я выполняю его, операция в конечном итоге истекает, если мой startId больше 7 000 000.Размер страницы, который я использую, равен 200. Я использовал этот метод для таблиц гораздо меньшего размера, содержащих менее 1000 строк, и он работает и работает быстро.

Вопрос в том, что для такой большой таблицы лучшеспособ сделать это с помощью NHibernate?

Ответы [ 3 ]

2 голосов
/ 16 февраля 2012

Вы пытаетесь пролистать 10 миллионов строк по 200 за раз?Зачем?Ни один человек не собирается просматривать эти данные.

Сначала необходимо отфильтровать набор данных, а затем применить пейджинг в стиле TSQL к меньшему набору данных. Вот некоторые методы, которые будут работать .Просто измените их так, чтобы через какую-то фильтрацию вы получили менее 10 миллионов строк (предложение WHERE, CTE или производная таблица).

1 голос
/ 16 февраля 2012

Это может быть связано с проблемой слоя изоляции.

У меня были похожие проблемы.Если таблица, из которой вы читаете, постоянно обновляется, средство обновления блокирует части таблицы, вызывая тайм-аут, а затем считывание из таблицы.Добавьте SetIsolationLayer (ReadUncommitted), вы должны заметить, что данные могут быть немного грязными.

1 голос
/ 16 февраля 2012

Забавно, вы должны поднять это, так как у меня та же проблема.Моя проблема не связана с подкачкой страниц с использованием NHibernate, но больше связана с простым использованием T-SQL.

Кажется, что есть несколько вариантов.Тот, который я нашел весьма полезным в моем случае, был этот ответ на вопрос, касающийся подкачки.В нем обсуждается использование "решения, управляемого ключами ..", а не возвращение ранжированных результатов с помощью ROW_NUMBER ().Я не уверен, что NHibernate будет использовать в этом случае или если возможно увидеть SQL, который он генерирует на основе вашего запроса (я знаю, что вы могли бы в Hibernate, но я не использовал NHibernate).

Если вы не знаете, как использовать SQL SERVER для получения ранжированных результатов, основанных на ROW_NUMBER, тогда стоит посмотреть.Многие люди, кажется, обращаются к этой статье о том, как делать пейджинг.Я видел, как некоторые последующие публикации не одобряют использование SET ROWCOUNT, хотя в пользу использования TOP с динамическим параметром - SELECT TOP (@NumOfResults).

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

...