I'm делает постраничный запрос, используя следующий шаблон:db2 производительность пагинации запроса
select * from (select rownumber() over
(order by aaa.x) as rownum, aaa.abc, aaa.bcd,bbb.cde from aaa as aaa
left join bbb on aaa.colx= bbb.coly where aaa.where1 = 'xxx'
) as tempresult where rownum between 101 and 200
Предполагая, что размер страницы 100 пунктов, то первый запрос страницы будет то же самое, заменив условие RowNum для:
where rownum <= 100
I'm сталкивается с ситуацией, когда первая страница выполняет очень хорошо (< 1s), но когда мы переходим от второй страниц вперед запрос занимает около 5-6s.
- Может ли кто-нибудь объяснить мне, почему это так?
- Есть ли способ слегка изменить этот шаблон запроса, чтобы добиться лучшей производительности?
- Есть ли какая-то полная стратегия, которая могла бы работать лучше?
Дополнительная информация:
- Я использую v9.7.400.501 DB2
- There's нет предела ключевого слова
- Я не могу создать представления или хранимые процедуры в связи с ограничением клиента
- Я не могу создать никаких дополнительных индексов.
- Пробовал переключение с rownumber() no rank(), но ничего не изменил
Цените ответ Mustaccio. Фактически, удаление полностью левого соединения заставило его работать очень быстро! Но я не мог переместить соединение, как сказал, так как на самом деле в исходном запросе (отредактированный вопрос) на самом деле был bbb.cde. –
Фактически, мне удалось работать над вашей линией, изменив запрос дальше. Я просто не знаю, однако, если я смогу изменить код для создания такого запроса, но в любом случае, это действительно хороший совет. Спасибо –
да, я сделал ur редактирование предложения, но: 1), что было бы дорогостоящей модификацией кода для регенерации этих запросов 2) если мне нужно было отсортировать по bbb.coly, тогда мне все равно понадобится вещь внутри запроса rownumber() (хорошо, я не упомянул возможности сортировки, но отредактировал вопрос) –