2014-10-29 3 views
0

Мы обнаружили, что в нашем приложении .NET 4.51/nHibernate/SQL 2008, когда мы выполняем один большой запрос, мы получаем все данные, но когда мы создаем страницы против некоторых больших наборов результатов, строки пропускаются.Пейджинг в nHibernate против SQL Server: требуется ли порядок сортировки?

(В нашем тестировании, когда мы делаем страницы 200 на страницу, против результирующего набора, который 1000 или более строк, мы видим проблему.)

Мы попробовали приложение с помощью SQL2000 и SQL2005 NHibernate диалектов , и не видел различий в поведении. (Синтаксис запроса развивается, чтобы использовать новые конструкторы в SQL2005, но при использовании диалекта SQL2005 отсутствуют такие же данные.)

nHibernate генерирует SQL-запросы. Мы делаем пейджинг. Если страница 100, как NHibernate генерирует последовательные запросы SQL является:

  • TOP 100 // дает нам первый 100
  • TOP 200 // дает нам 2-й 100 этого блока
  • и т.д.

Вышеприведенный, без ORDER BY/sorting на nHibernate уровне, имеет конечный результат, что некоторые строки никогда не имеют nHibernate. Мы предполагаем, что это связано с произвольной сортировкой по SQL, так что строки «перемещаются» внутри страниц (и, таким образом, «скрываются» от нашего кода приложения).

Если мы выполняем запрос nHibnerate как один снимок (возвращаем все строки), мы видим все данные. (Этот запрос ниже генерируется nhibernate.)

Помогает ли добавление порядка заказа (ака nHibernate)?

SELECT top 33 
... <field list> 
FROM 
    salesOrder this_ left outer join [Item] Item2_ on this_.ItemId=Item2_.ItemId 
WHERE this_.AccountId = @p0 
and this_.ModifiedAt > @p1 
and this_.ModifiedAt <= @p2 

База данных довольно большой, но не фрагментирован, и производительность велика. Проблема была видна только на очень больших таблицах (100 миллионов строк), и даже тогда, когда запрос возвращает> 1000 строк И выгружается.

Является ли порядок заказа (сорт на уровне nibernate) решением, или есть другой путь, который нам нужно взять?

+0

@ RadimKöhler Мы видим работу подкачки, практически во всех случаях ... кроме случаев, когда это не так. Эта проблема вызвана большими наборами данных в большой базе данных. Вопрос здесь: Как сделать его% 100 надежным? – Jonesome

+0

Вы должны * обязательно * заказывать свой результат, если вы подкачки. В противном случае поведение SQL-сервера не определено - оно может возвращать строки в любом порядке. –

+0

@ RadimKöhler OP изменен – Jonesome

ответ

0

Ответ: ORDER BY не требуется.

IOW, используйте запрос сортировки (в индексированном поле для получения наилучших результатов!) По запросу nHibernate.

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