2015-01-13 2 views
0

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.

  1. Может ли кто-нибудь объяснить мне, почему это так?
  2. Есть ли способ слегка изменить этот шаблон запроса, чтобы добиться лучшей производительности?
  3. Есть ли какая-то полная стратегия, которая могла бы работать лучше?

Дополнительная информация:

  • Я использую v9.7.400.501 DB2
  • There's нет предела ключевого слова
  • Я не могу создать представления или хранимые процедуры в связи с ограничением клиента
  • Я не могу создать никаких дополнительных индексов.
  • Пробовал переключение с rownumber() no rank(), но ничего не изменил

ответ

2

Вам нужно будет посмотреть планы выполнения обоих запросов, чтобы увидеть, есть ли разница - только это может дать вам определенный ответ.

Вы могли бы попытаться переписать запрос на так:

select * from (
    select rownumber() over (order by aaa.x) as rownum, aaa.abc, aaa.bcd 
    from aaa as aaa 
    where aaa.where1 = 'xxx' 
) as tempresult 
left join bbb on tempresult.colx= bbb.coly 
and tempresult.rownum between 101 and 200 

Edit:

Ничто не мешает вам использовать колонн из bbb в финале выберите:

select tempresult.*, bbb.cde 
from (
    select rownumber() over (order by aaa.x) as rownum, aaa.abc, aaa.bcd 
    from aaa as aaa 
    where aaa.where1 = 'xxx' 
) as tempresult 
left join bbb on tempresult.colx= bbb.coly 
and tempresult.rownum between 101 and 200 
+0

Цените ответ Mustaccio. Фактически, удаление полностью левого соединения заставило его работать очень быстро! Но я не мог переместить соединение, как сказал, так как на самом деле в исходном запросе (отредактированный вопрос) на самом деле был bbb.cde. –

+0

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

+0

да, я сделал ur редактирование предложения, но: 1), что было бы дорогостоящей модификацией кода для регенерации этих запросов 2) если мне нужно было отсортировать по bbb.coly, тогда мне все равно понадобится вещь внутри запроса rownumber() (хорошо, я не упомянул возможности сортировки, но отредактировал вопрос) –

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