2012-02-15 2 views
2

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

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

Когда я исполняю его операция в конце концов, раз, если мой startId больше 7000000. Используемый мной параметр pageSize - 200. Я использовал этот метод на гораздо меньших таблицах, менее 1000 строк, и он работает и работает быстро.

Вопрос: на таком большом столе есть лучший способ добиться этого, используя NHibernate?

+0

Какие rdbms? или как выглядит SQL? Может быть, попробуй бросить OrderBy там ... – dotjoe

+0

Это MSSQL2005. Попытка заказа сейчас. – Dave

+0

Заказ на самом деле не имел никакого значения, но я обнаружил, что изменение startId на меньшее значение позволило завершить операцию. Кажется, он задыхается с начальным значением около 7 000 000 или выше. Все, что ниже, медленное, но, по крайней мере, заканчивается. – Dave

ответ

2

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

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

+0

Хорошая ссылка. Я также видел этот комментарий «.. почему бы вы захотели ...» много в отношении пейджинга. Во многих случаях это просто бизнес-требование. Я работаю над системой, которая импортирует текстовые текстовые файлы (некоторые из которых содержат сотни тысяч строк). Мы предоставляем функцию просмотра файлов после их импорта, и я не собираюсь загружать ВСЕ строки, чтобы они могли видеть, поэтому пейджинг кажется идеальным решением. Это усугубляется тем фактом, что пользователи хотят иметь возможность сортировать по различным столбцам, поэтому, хотя они могут не захотеть просматривать весь файл, им нужен механизм для просмотра данных. –

+0

У меня было это требование раньше. Данные не будут отображаться. Предполагая 1 секунду на страницу, потребуется 138 часов, чтобы пройти через нее. Они хотят посмотреть набор образцов и посмотреть, что доступно 10 миллионов. Обеспечьте им хорошую индексацию и способ поиска по важным полям, и они должны быть счастливы. Вы упорно трудитесь, чтобы решить то, что просто никогда не будет использоваться так, как они говорят, что это необходимо. Я бы справился с этими требованиями, чтобы их улучшить. Покажите им, насколько они сумасшедшие. Объясните и продемонстрируйте альтернативы. Вы - человек, обладающий знаниями в комнате. –

+2

Не то, чтобы мы пытались прочитать записи 10M, но мы могли бы только увидеть последние несколько сотен. Возможно, вы можете предложить альтернативную стратегию для этого. – Dave

1

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

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

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

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

1

Это может быть проблемой изолирующего слоя.

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

+0

Благодарим за предложение, у изолирующего слоя уже установлен ReadUncommited. – Dave

Смежные вопросы