Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
постраничный вывод(именно постраничный)
|
|||
|---|---|---|---|
|
#18+
Добрый день! Решил сделать постраничный вывод в DB2. Дело дошло до sql запроса. Самый простой способ это где-то(например, как у меня переменная сессии в вэб-приложении) хранить стек со значениями первичного ключа(ПК суррогатный, инкрементный), а запрос типа: Код: sql 1. где, x-значение первичного ключа из стека(где первое значение 0) n-кол-во записей на странице. Все замечательно, НО в данном случае можно перемещаться назад и вперед на 1 шаг. Согласен, можно при перемещениях вперед сохранять историю о страницах и указывать их на странице. Можно определить общее количество строк и понять сколько будет страниц. Но вот как найти значения ID для каждой новой порции не выбирая всех данных? То есть хочется выполнив поиск, на странице получить перечень номеров страниц, нажимая на которые произвольным образом получить соответствующую порцию данных. Понятно, что если в указанном выше запросе max будет работать для всей выборки, а не n первых записей. Поделитесь мыслью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 12:49 |
|
||
|
постраничный вывод(именно постраничный)
|
|||
|---|---|---|---|
|
#18+
Андрей Васильевич, Добрый день. Пока вы не получите все строки, вы не сможете в точности определить, сколько вам строк вернётся. Не выполняя запрос, вы можете получить от оптимизатора только примерное количество строк, которое вернётся. В 9.7.3 появился метод для получения такой информации. Код: java 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 13:28 |
|
||
|
постраничный вывод(именно постраничный)
|
|||
|---|---|---|---|
|
#18+
Ну вот почему нельзя так сделать? Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 13:50 |
|
||
|
постраничный вывод(именно постраничный)
|
|||
|---|---|---|---|
|
#18+
Хотя даже если бы и работало это, то количество запросов было бы равное количеству страниц(это в первом запросе при определении количества страниц). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 14:06 |
|
||
|
постраничный вывод(именно постраничный)
|
|||
|---|---|---|---|
|
#18+
Андрей Васильевич, Пока не материализована выборка, сказать, что там будет на N-й cтранице невозможно, если не хранить это прекалькулированным. Т.е. надо выбрать весь set, который мы собираемся представлять пользователю. Но если это много, то: - Страница 3487 результата - это не то, что вообще обрабатываемо человеком через GUI, т.е. можно ограничиться где-нибудь 50-ю страницами при сотне результатов на странице, т.е. 5 000 записей (а может и меньше). Это скорее всего в пределах одного extent'а, т.е. с диска читается за раз. - С сортировкой внимательно смотреть, чтобы реальной сортировки не происходило а был только index scan. Эти 5 000 ID'шников (или пограничные значения для страниц) хранить в кэше, а для следующих (если всё-таки есть желание сохранить возможность добраться до них через UI) уже повторять запрос, по мере необходимости включая дополнительные результаты. Ну, можно ещё MQT cоорудить: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. PS Ещё момент, FETCH FIRST N ROWS ONLY игнорируется оптимизатором, а только подсказывает оптимальные размеры буферов для клиента (ну и физически ограничивает выборку), добавляйте ещё OPIMIZE FOR N ROWS, хотя в данном случае может не иметь значения. И обратите внимание на получаемые планы, для "where ID_T>=x ...", если x параметризован, то оно может превратиться в FULLSCAN по таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 15:56 |
|
||
|
постраничный вывод(именно постраничный)
|
|||
|---|---|---|---|
|
#18+
Андрей ВасильевичНу вот почему нельзя так сделать? Код: sql 1. BTW Почти можно (с поправкой на то, что "rows" в "n rows only" пропущено), но - fetch first ... применяется к финальному result set'у (т.е. честно отдаст одну единственную строчку); - order by и список колонок в result-set'е не согласуется. Можно вот так cформулировать: Код: sql 1. 2. 3. 4. Но да, чтобы добраться до N-й страницы, нужно N запросов сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 17:36 |
|
||
|
|

start [/forum/topic.php?fid=43&fpage=46&tid=1601888]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
15ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
| others: | 16ms |
| total: | 189ms |

| 0 / 0 |
