У нас есть представление, что без ограничений вернет 90 миллионов строк и приложение для отчетов, которое должно отображать постраничные наборы данных этого представления.
Мы используем nhibernate и недавно заметили, что его механизм подкачки выглядит следующим образом:
select * from (select rownumber() over() as rownum,
this_.COL1 as COL1_20_0_,
this_.COL2 as COL2_20_0_
FROM SomeSchema.SomeView this_
WHERE this_.COL1 = 'SomeValue') as tempresult
where rownum between 10 and 20
Запрос ставит сервер БД на колени. Я думаю, что происходит то, что вложенный запрос назначает номер строки каждой строке, удовлетворяющей предложению where, перед выбором подмножества (строки 10 - 20). Поскольку вложенный запрос будет возвращать много строк, механизм не очень эффективен. Я видел множество советов и приемов для эффективного выполнения этого на других платформах SQL, но я изо всех сил пытаюсь найти решение DB2. Фактически статья на собственном сайте IBM рекомендует подход, принятый nhibernate.
Есть ли лучший способ?