powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос по pagination
18 сообщений из 18, страница 1 из 1
Вопрос по pagination
    #39323180
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нужно получить большое число строк (тысячи, десятки тысяч) и отобразить их постранично.
Погуглил, как правило ссылаются на книжку « The Underground PHP and Oracle Manual ».
В книжке есть раздел «Limiting Rows and Creating Paged Datasets», суть решения заключается в следующем:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select *
from (
  select a.*, rownum as rnum
  from (
    <мой SQL-запрос>
    order by ...
  ) a
  where rownum <= MAX
) where rnum >= MIN


Честно говоря, выглядит как-то топорно — два вложенных запроса, чтобы ограничить выборку пронумерованными строками сверху и снизу.
Это оптимальный способ или есть другие решения?

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

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
Вопрос по pagination
    #39323184
Alibek B. два вложенных запросаты тут вокруг этого запроса столько букв написал, что хватит на сорок запросов.
...
Рейтинг: 0 / 0
Вопрос по pagination
    #39323187
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лимит кляуза, у меня Oracle 10g, в нем нет LIMIT.
...
Рейтинг: 0 / 0
Вопрос по pagination
    #39323201
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Alibek B.,

оптимальным было бы сделать демона, например, на Java и такие чтобы такие данные отдавал он, а он сам чтобы отдавал номер своего двунаправленного курсора и требуемые данные и закрывал эти курсоры по настраиваемому таймауту.
...
Рейтинг: 0 / 0
Вопрос по pagination
    #39323218
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю что это для меня будет сложно.

А насколько приемлемо следующее решение?
Я создаю две новых таблицы, SEARCH_SET и SEARCH_CACHE.
При каждом запросе я добавляю в SEARCH_SET новую запись (или ищу существующую запись с аналогичными критериями) и получаю PK для добавленной или найденной записи (SEARCH_ID).
Результаты запроса я сохраняю в SEARCH_CACHE, добавляя к ним SEARCH_ID.
Отображение и навигацию я осуществляю с использованием SEARCH_CACHE.
В SEARCH_SET также фиксируется дата добавления/обновления результатов, чтобы очищать просроченный кеш.
Заодно наличие такой таблицы сильно упростит подсчет количества строк в результате (чтобы правильно отобразить пагинацию).

Или это неправильно?
...
Рейтинг: 0 / 0
Вопрос по pagination
    #39323227
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.лимит кляуза, у меня Oracle 10g, в нем нет LIMIT.
в десятке есть аналитика
что мешает использовать напр row_number/rank?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  1  select * from
  2   (select ename,sal,row_number() over (order by sal) rn from emp)
  3* where rn between 4 and 6
SQL> /

ENAME             SAL         RN
---------- ---------- ----------
WARD             1250          4
MARTIN           1250          5
MILLER           1300          6



.....
stax
...
Рейтинг: 0 / 0
Вопрос по pagination
    #39323229
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну что вы, это же не чистое решение, один подзапрос вместо двух.

А надо без подзапросов !!!
...
Рейтинг: 0 / 0
Вопрос по pagination
    #39323253
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
<мой SQL-запрос> — достаточно тяжелый запрос, который выполняется несколько десятков секунд и возвращает много строк.
Мне почему-то кажется, что если вложить такой запрос в два внешних запроса (или даже один внешний запрос с аналитикой), то это скорость выполнения не увеличит.
То есть при листании страниц с результатами на каждой странице я буду дважды выполнять этот тяжелый запрос (первый раз с count(*), чтобы посчитать число результатов, второй раз вложив во внешний запрос, чтобы получить строки для выбранной страницы).
Если использовать сохранение результатов запроса во временной таблице (в кеше), то листание страниц и подсчет количества результатов станет тривиальной операцией и некоторые сложности могут быть только с правильным сбросом кеша.
...
Рейтинг: 0 / 0
Вопрос по pagination
    #39323268
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.<мой SQL-запрос> — достаточно тяжелый запрос, который выполняется несколько десятков секунд и возвращает много строк.
Мне почему-то кажется, что если вложить такой запрос в два внешних запроса (или даже один внешний запрос с аналитикой), то это скорость выполнения не увеличит.
То есть при листании страниц с результатами на каждой странице я буду дважды выполнять этот тяжелый запрос (первый раз с count(*), чтобы посчитать число результатов, второй раз вложив во внешний запрос, чтобы получить строки для выбранной страницы).
Если использовать сохранение результатов запроса во временной таблице (в кеше), то листание страниц и подсчет количества результатов станет тривиальной операцией и некоторые сложности могут быть только с правильным сбросом кеша.
в кеше всеравно надо пронумеровать

я не предлагаю для каждой странички перевыполнять запрос
хотя так более правильно
не знаю как у Вас с постановкой

напр в результате запроса 100страниц
я смотрю долго первую
потом хочу посмотреть вторую, за время просмотра она ж может изменится
что отобразите на екране?

если "кешировать", то не в БД, ето ж накладно, напр будут пухнуть логи

.....
stax
...
Рейтинг: 0 / 0
Вопрос по pagination
    #39323282
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Alibek B.,

Вообще есть result_cache для этого. Просто в подзапросе добавить хинт result_cache и оракл сам остальное сделает
...
Рейтинг: 0 / 0
Вопрос по pagination
    #39323285
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderAlibek B.,

Вообще есть result_cache для этого. Просто в подзапросе добавить хинт result_cache и оракл сам остальное сделает
не понял, считал что result_cache относится к функциям

.....
stax
...
Рейтинг: 0 / 0
Вопрос по pagination
    #39323287
Постраничный вывод в нынешних реалиях уже не предмет переживаний. Закачивай в паямять сервера приложений или клиента тысячу строк и вари как хочешь.
Больше строк просматривать, жмакая ..2..3..99, смысла нет. Это либо сплошная выгрузка для обработки внешними инструментами либо аналитические кубики, отображающие агрегированные итоги.
...
Рейтинг: 0 / 0
Вопрос по pagination
    #39323288
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
...
Рейтинг: 0 / 0
Вопрос по pagination
    #39323325
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderВообще есть result_cache для этого.
Не знал про такое.
Да, похоже что велосипед изобретать не нужно.
...
Рейтинг: 0 / 0
Вопрос по pagination
    #39324632
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посоветуйте, как лучше сделать?

Допустим запрос возвращает 200 строк.
В форме поиска кроме критериев поиска также можно указать, сколько результатов должно быть на одной странице: 10, 25, 50, 100 или все.
Допустим было выбрано 25 — значит получится 8 страниц с результатами поиска.
Допустим выбрана страница 3, строки с 51 по 75.
Затем в форме поиска я указываю вывод по 50 результатов на страницу.
Где правильнее оказаться, на странице 3 со строками 101-150 или на странице 2 со строками 51-100?
...
Рейтинг: 0 / 0
Вопрос по pagination
    #39325010
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.лимит кляуза, у меня Oracle 10g, в нем нет LIMIT.

xtenderAlibek B.,

Вообще есть result_cache для этого. Просто в подзапросе добавить хинт result_cache и оракл сам остальное сделает
...
Рейтинг: 0 / 0
Вопрос по pagination
    #39325238
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderВообще есть result_cache для этого.Клиентский кеш на странички резать не представляю как. А серверный - если объем небольшой, то проще его весь на клиента выгрузить, сети нынче "резиновые". Если большой, то поможет только для небольшого количества клиентов. Иначе никакой памяти на сервере не напасешься. К тому же, получение первой страницы может выполняться в порядке индекса, последующие страницы незачем через кеш прокачивать.
...
Рейтинг: 0 / 0
Вопрос по pagination
    #39325247
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Клиентов как раз будет мало, это служебное веб-приложение, а вот размер данных, получаемых с сервера, большим.
Поэтому хинт для кеша я указываю для внутреннего запроса.
Правда я особой разницы не заметил.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос по pagination
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]