Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2014.02.23;
Скачать: [xml.tar.bz2];

Вниз

Oracle подскажите выход   Найти похожие ветки 

 
Demo   (2013-09-11 09:31) [0]

Добрый день!

Имеется запрос в Oracle, который выполняется из проекта в Delphi.  
Из за того, что запрос возвращал большое количество записей, я сделал возможность вывода определенного количества строк а в запросе урезал
rownum < count. Теперь стоит задача, что бы пользователь мог указать 5000 записей, а затем нажать "далее" и отобразить след. 5000. Есть компоненты в Delphi которые могут такое, но для этого нужно опять же загрузить все записи из базы, что очень долго. Подскажите как решить такую задачу ?


 
macrodens ©   (2013-09-11 09:41) [1]

cxGrid (свойство GridMode) из палитры DevExpress умеет выводить нужное количество строк и при скроллинге догружать данные.
Также можно сделать именно запросом, не знаю как в Oracle, но в MySQL можно указать так:
select <FIELD_LIST> from <you_table> limit a,b,
где a - начальная строка, b - количество строк


 
[ВладОшин] ©   (2013-09-11 10:22) [2]

//  Oracle Data Access Components
//  Copyright (c) 1998-2009 Devart. All right reserved.

   oq1: TOraQuery;

>> я сделал возможность вывода определенного количества строк
oq1.FetchRows := определенного количества строк ;

>> Теперь стоит задача, что бы пользователь мог указать 5000 записей, а затем нажать "далее" и отобразить след. 5000.
oq1.FetchRows := 5000;

как только будет запрос 5001ой строки, автоматом подгрузится следующая порция, в колве oq1.FetchRows записей


 
Кщд   (2013-09-11 10:23) [3]

>Demo   (11.09.13 09:31)
http://lmgtfy.com/?q=oracle+paging+example


 
antonn ©   (2013-09-11 10:43) [4]


> как только будет запрос 5001ой строки, автоматом подгрузится
> следующая порция, в колве oq1.FetchRows записей

результат запроса оно еще хранит на сервере или при каждом "листании" запрос заново работает?


 
[ВладОшин] ©   (2013-09-11 10:45) [5]


>  при каждом "листании" запрос заново работает?


нет,
запрос заново не отрабатывает


 
Demo   (2013-09-11 10:52) [6]

Спасибо за столько быстрые ответы. Сейчас буду пробовать.


 
antonn ©   (2013-09-11 11:00) [7]


> нет,
> запрос заново не отрабатывает

а результат хранится пока есть конекшн или по времени? (id его нужно хранить?)


 
[ВладОшин] ©   (2013-09-11 11:08) [8]


>  результат хранится пока есть конекшн или по времени?

пока жива сессия (oq1.Session := os1; // os1: TOraSession;)


 
Кщд   (2013-09-11 15:00) [9]

>[ВладОшин] ©   (11.09.13 11:08) [8]
как бы не попасть в ад: ORA-01555


 
Sergey13 ©   (2013-09-11 15:23) [10]

А если, как вариант, использовать временную таблицу? Заполнил один раз и крути как хочешь хоть всю сессию.


 
Кщд   (2013-09-11 15:29) [11]

>Sergey13 ©   (11.09.13 15:23) [10]
это крайнее средство, когда не удаётся реализовать пейджинг штатными средствами - запросом.


 
[ВладОшин] ©   (2013-09-11 15:29) [12]

>> как бы не попасть в ад: ORA-01555

Ну надо просто представлять для чего эта интерактивная функция,
что можно давать делать, что нет.

Если, допустим, форма справочники смотрит - то пусть смотрят. Они меняются раз в пятилетку. Или Если, допустим, платежи смотрят - то пусть смотрят. Они не меняются, только добавляются.
ну и oq.FetchAll := true, тоже можно. Пусть все берет, если уверен.


 
Кщд   (2013-09-11 15:39) [13]

>[ВладОшин] ©   (11.09.13 15:29) [12]
зачем всё это, когда можно запросом?)


 
antonn ©   (2013-09-11 17:40) [14]


> это крайнее средство, когда не удаётся реализовать пейджинг
> штатными средствами - запросом.

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


 
Dennis I. Komarov ©   (2013-09-11 20:28) [15]

на кой юзеру даже 5000 записей?


 
antonn ©   (2013-09-11 20:59) [16]


> на кой юзеру даже 5000 записей?

чтобы выполнить гибкую сортировку, группировку и фильтрацию на клиенте


 
Dennis I. Komarov ©   (2013-09-11 21:08) [17]


> чтобы выполнить гибкую сортировку, группировку и фильтрацию
> на клиенте

Вот поди нужна одна (две, три)...


 
Пит   (2013-09-11 21:16) [18]


> нет,
> запрос заново не отрабатывает

спорное мнение. Ну то есть, заново - нет. Но вот что результаты могут вычисляться по мере фетчинга - это может быть. Собственно, от этого даже может зависеть план. Есть стратегия получения как можно быстрее первых результатов, а есть стратегия за наименьшее время получить все результаты.


 
Кщд   (2013-09-11 22:25) [19]

>antonn ©   (11.09.13 17:40) [14]
>в данном случае это не просто запрос, это хранение результата запроса.
где это сказано?

>antonn ©   (11.09.13 20:59) [16]
>чтобы выполнить гибкую сортировку, группировку и фильтрацию на клиенте
зачем, если есть возможность сделать тоже самое, но на актуальных данных?
вопрос в "Dennis I. Komarov ©   (11.09.13 20:28) [15]" категорически логичен, коли речь идёт о 5e3 записей только на ОДНУ страницу
итак, зачем что-либо кэшировать, когда можно получить ровно то, что нужно, и актуально на данный момент?


 
Кщд   (2013-09-11 22:27) [20]

>Пит   (11.09.13 21:16) [18]
>Но вот что результаты могут вычисляться по мере фетчинга
да, это "косяк" транзакционной модели Oracle.

>Собственно, от этого даже может зависеть план.
не "догнал", от чего может зависеть план в данном случае?


 
Dennis I. Komarov ©   (2013-09-11 22:39) [21]


> вопрос в "Dennis I. Komarov ©   (11.09.13 20:28) [15]" категорически
> логичен, коли речь идёт о 5e3 записей только на ОДНУ страницуитак,
>  зачем что-либо кэшировать, когда можно получить ровно то,
>  что нужно, и актуально на данный момент?

более этого, бегать по страницам в 5000 записей во временном разрезе базы...


 
antonn ©   (2013-09-11 22:59) [22]


> где это сказано?

выше полистай


> зачем, если есть возможность сделать тоже самое, но на актуальных
> данных?

потому что на клиенте это может быть гибче и быстрее в силу того что данные уже сформированы


 
Dennis I. Komarov ©   (2013-09-11 23:09) [23]


> потому что на клиенте это может быть гибче и быстрее в силу
> того что данные уже сформированы

пример?


 
antonn ©   (2013-09-12 09:25) [24]


> пример?

например посмотри возможности GridEx (сортировка, фильтры, группировка перетаскиванием) и прикинь как можно быстро и удобно пользователю забабахать консолидацию с нужными ему фильтрами (которые могут переключаться тут же на разное поведение (исключая символы, включая их, в начале/конце и тп)), сортировками по нужным столбцам в нужных направлениях, меняя местами колонки как захочется. Плюс сохранить эти настройки и подгружать как рабочую область - гибкий юзерфрендли требующий только толстый клиент и память, но не требующий внесение изменений в базу (запрос/процедуру, например не надо протаскивать имя поля и направление для сортировки). И все это на данных которые для сервера - куча строк, которые могут выбирать сложной хранимкой минут 5: выбрал, отдал, а клиент их посмотрит в том виде, в каком он удобнее для себя настроил грид.


 
[ВладОшин] ©   (2013-09-12 09:47) [25]


> пример?

15 соединений таблиц, в т.ч. по функции, на 2-3 минут времени.
итог - порядка 1000 записей
вывод на экран - 10 записей
Теперь пользователь захотел немного в ином разрезе посмотреть, группировку сменить, некоторые скрыть. Опять 2-3 минуты ждать?


> Кщд   (11.09.13 15:39) [13]
> >[ВладОшин] ©   (11.09.13 15:29) [12]
> зачем всё это, когда можно запросом?)

иногда проще бывает, особенно в условиях цайтнота


 
[ВладОшин] ©   (2013-09-12 09:49) [26]

Zeitnot*
когда некогда, короче :)


 
Кщд   (2013-09-12 10:00) [27]

>antonn ©   (11.09.13 22:59) [22]
>выше полистай
полистал
можно цитату, в которой указывается на необходимость сохранять результат и - затем - листать именно его?

>потому что на клиенте это может быть гибче и быстрее в силу того что данные уже сформированы
на клиенте быстрее, чем SQL-запросом?
в общем случае, спорное утверждение

в общем и целом, при эффективно написанном запросе, правильный ответ: pagination средствами Oracle.
остальное - костыли, которые могут привести к появлению "фантомных"(реально отсутствующих в базе) записей в отчёте и очень неприятным exception, ломающим отчёт полностью.


 
antonn ©   (2013-09-12 10:13) [28]


> можно цитату, в которой указывается на необходимость сохранять
> результат и - затем - листать именно его?

нет нельзя, потому что о необходимости речи не шло


> на клиенте быстрее, чем SQL-запросом?

не надо путать выбранные данные и их представление. Хотя в большинстве случаев быдлокодеры конечное представление ограничивают условиями выборки в запросе, это не является гибким и универсальным решением :)


 
Кщд   (2013-09-12 10:20) [29]

>antonn ©   (12.09.13 10:13) [28]
складывается ощущение, что ведёте разговор с собой, обсуждая выдуманные Вами ограничения и потребности ТС
появляются какие-то хранимки, работающие по 5мин, какие-то странные филосовствования на тему "быдлокодеров" и пр.
видимо, ключевое слово rownum в первом посте ТС, Вам ничего не говорит
так я намекну: у ТС запрос
запрос, результаты которого он желает листать по 5 000 записей
про фильтры и кастомные сортировки у ТС ничего не было сказано - это всё Ваши домыслы


 
Кщд   (2013-09-12 10:20) [30]

*философствования)


 
antonn ©   (2013-09-12 10:37) [31]


> Кщд   (12.09.13 10:20) [29]

вы знаете сколько выполняется запрос у ТСа и какую нагрузку он дает? :) если нет, то - [14], потому что вы именуете "запросом" на самом деле есть нативное [10] судя по [7]+[8]. Я достаточно полно восстановил цепочку, которую вам трудно было отследить? :)


> про фильтры и кастомные сортировки у ТС ничего не было сказано
> - это всё Ваши домыслы

ТС тут не причем, это было к [15], всего лишь на предыдущей странице


 
Кщд   (2013-09-12 12:25) [32]

>antonn ©   (12.09.13 10:37) [31]
>потому что вы именуете "запросом" на самом деле есть нативное [10]
нативное для чего?)
что вообще за поток сознания?)
запросом я именую то, что начинается с select, а Вы?)
сформулируйте мысль чётко
глобальные временные таблицы - это весьма native-инструмент Oracle, открытый курсор - тоже вполне себе "нативно", вот только это не одно и то же
Вы берётесь рассуждать о вещах, в которых не смыслите


 
antonn ©   (2013-09-12 12:34) [33]


> запросом я именую то, что начинается с select, а Вы?)

а мы смотрим глубже того, что начинается с select. точнее даже чем оно заканчивается :)


 
Кщд   (2013-09-12 12:42) [34]

>antonn ©   (12.09.13 12:34) [33]
>а мы смотрим глубже того, что начинается с select.
а, любители сферических коней)
по теме: в чём недостатки организации pagination  с помощью аналитических ф-ций(или rownum) в Oracle?
лучше с помощью кода, а не общих бессмысленных фраз типа "а мы смотрим глубже того, что начинается с select"


 
antonn ©   (2013-09-12 12:50) [35]


> по теме: в чём недостатки организации pagination  с помощью
> аналитических ф-ций(или rownum) в Oracle?

каков ответ на [4]?


 
Кщд   (2013-09-12 13:01) [36]

>antonn ©   (12.09.13 12:50) [35]
1. запрос не проходит стадию parse;
2. результат запроса, в общем случае, не хранится.


 
Кщд   (2013-09-12 13:02) [37]

>antonn ©   (12.09.13 12:50) [35]
теперь Ваша очередь ответить на [35].


 
antonn ©   (2013-09-12 13:10) [38]


> 1. запрос не проходит стадию parse;
> 2. результат запроса, в общем случае, не хранится.

это идет вразрез с [5], если результат запроса не хранится, значит при "пейджинге" запрос отрабатывает еще раз?


 
Кщд   (2013-09-12 13:38) [39]

>antonn ©   (12.09.13 13:10) [38]
>это идет вразрез с [5], если результат запроса не хранится, значит при "пейджинге" запрос отрабатывает еще раз?
запрос может находиться в одной из трёх фаз: parse, execute, fetch.
что значит для Вас фраза: "запрос отрабатывает еще раз"?
очень жаль, что Вы не владеете элементарной терминологией


 
Кщд   (2013-09-12 13:39) [40]

>antonn ©   (12.09.13 13:10) [38]
и, да - это ни с чем не идёт вразрез
просто Вы не представляете механизма работы СУБД(в данном случае - Oracle).



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2014.02.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.003 c
15-1378532362
Мишаня
2013-09-07 09:39
2014.02.23
Прога для VoIP Viber отзывы


2-1367565141
Scrooge_
2013-05-03 11:12
2014.02.23
Сортировка по алфавиту


15-1378465391
Kostafey
2013-09-06 15:03
2014.02.23
Кто на чем сейчас пишет?


1-1321963452
asafr
2011-11-22 16:04
2014.02.23
DocsVision и Delphi


3-1296163023
red_imp
2011-01-28 00:17
2014.02.23
Кодировка в dbf файле





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский