Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
FetchRows в zeos или DataSet
|
|||
|---|---|---|---|
|
#18+
Привет народ! Начал работать с PG+Delphi+Zeos и столкнулся с проблемой При выборке из таблицы (1000000 записей) типа Код: plaintext конечно можно ограничить вывод limit но вдруг пользователю всетаки нужно будет больше чем ты поставишь значение в limit. Отсюда вопрос: Кто нибудь пытался сделать в zeos что-то типа fetch rows которая постранично подгружает данные в Dataset по мере необходимости ? Так сделано в ODAC MYDAC и многих других компонентах. Или если кто сталкивался напишите как решали данную проблему... Заранее благодарен. Креативу нет предела ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2005, 00:26 |
|
||
|
FetchRows в zeos или DataSet
|
|||
|---|---|---|---|
|
#18+
Юзаю триалы PostgresDAC. Те же яйца вид сбоку. И та же трабла. Может это проблема на концетпуальном уровне. Шо я только что сказал? Сам не понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2005, 22:06 |
|
||
|
FetchRows в zeos или DataSet
|
|||
|---|---|---|---|
|
#18+
У меня с наскоку сделать такое с Zeos не получилось, но подумав я решил, что мне это не очень и нужно. Аргументы такие: 1) пользователь не увидев в первых 2-3 экранах нужной информации начнет пытаться искать в том же гриде. Если возможность поиска в открытом датасете есть (допустим, используется TDBGridEh с инкрементным поиском по Ctrl+F) - начнет фетчится вся выборка => тормоза у клиента, затык в сети. То есть, вывод в одном датасете всех записей мне представляется излишним. Постраничная же навигация (с ограничением одновременно отображаемых записей) через FETCH FORWARD/FETCH BACKWARD или LIMIT .. OFFSET - делается и без этого. 2) если в объявлении курсора запрос с группировкой/сортировкой, то для курсора сервер вынужден будет выбрать все данные. Если десяток пользователей начнет такие миллионные выборки делать одновременно - туго серверу придется. Все же надо пользователя ограничивать. В общем, зелен виноград :-) Еще я не понял, как получить число записей в курсоре. Похоже постгрес такого функционала не дает, может потому и в компонентах для Дельфи курсоры не поддерживаются? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2005, 08:08 |
|
||
|
FetchRows в zeos или DataSet
|
|||
|---|---|---|---|
|
#18+
фффф...То есть, вывод в одном датасете всех записей мне представляется излишним. Постраничная же навигация (с ограничением одновременно отображаемых записей) через FETCH FORWARD/FETCH BACKWARD или LIMIT .. OFFSET - делается и без этого. тут я не понял. Где делается? Кем? Суть топика как раз сводится к тому, что компонентами них.. не делается. Возможно, Вы имеете в виду такую реализацию в своем приложении. Писать компоненты прямого доступа - кул. Яж на это не способный ( фффф2) если в объявлении курсора запрос с группировкой/сортировкой, то для курсора сервер вынужден будет выбрать все данные. Если десяток пользователей начнет такие миллионные выборки делать одновременно - туго серверу придется. До сих пор разговор шел про разгрузку клиента и сети. Мне необходимо, чтобы после выполнения запроса на сервере я увидел данные. Реально после выполнения запроса я еще жду некоторое количество времени (зависит от размера выборки) пока все данные не закачаются на клиента. Это сакс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2005, 15:23 |
|
||
|
FetchRows в zeos или DataSet
|
|||
|---|---|---|---|
|
#18+
ozГде делается? Кем? Суть топика как раз сводится к тому, что компонентами них.. не делается. Возможно, Вы имеете в виду такую реализацию в своем приложении. Да, имею в виду в приложении - над гридом кнопочки "Первая страница", "Пред. стр.", "След. стр.", "Последняя стр." - а в датасет грузится всегда фиксированное число записей. Если пользователь не может найти листанием нужной инфы - ему надо довводить условия запроса в фильтр. Проблема, что для каждой формы нужно настраивать - но в Дельфи через наследование форм делается легко. Это можно сделать и через один запрос SELECT LIMIT ... OFFSET и через курсор - на форме три ZQuery: DECLARE SCROLL CURSOR WITH HOLD, FETCH, CLOSE. Страница вперед: FETCH FORWARD N Страница назад: FETCH RELATIVE -2*N; FETCH FORWARD N (BACKWARD не катит - выдает записи в обратном порядке). И для определения числа записей приходится еще один запрос делать, блин. SELECT LIMIT ... OFFSET с большим оффсетом для сервера может быть и тяжелее чем курсор - тут надо по ситуации глядеть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2005, 04:10 |
|
||
|
FetchRows в zeos или DataSet
|
|||
|---|---|---|---|
|
#18+
Все огромное спасибо за участие в топике немного проясню ситуацию Я вижу решение этому такое: Идея в том, чтобы сам Zeos делал следующее: тогда когда курсор встает на последнюю позицию Dataset, делается дозапрос типа Select * from table добавляя вниз ограничение Limit одним словом C - ПО т.е как бы подгружал следующую страницу и добавлял эти записи в Dataset Теорию то я придумал, но вот как это реализовать .... ??? Скажем честно? я не смогу разобраться в исходнике Zeos TAbstractDataset А вот человек который сможет думаю без труда туда вкорячит постраничную подгрузку данных и соответсвенно параметр типа Fetchrows (колличество строк в странице) Кстати ODAC и MyDac именно так и сделан (постраничная додгрузка) Да и еще клевая фича метод RefreshRecord обновляет только текущую строку в DataSet указываешь только условие обновления Кстати исходники ODAC у меня тоже есть (честно купленные), там все это реализованно, но я там ничерта понять не могу. Есть у кого нибудь желание сделать такую функциональность Zeos пусть даже только для PG Я думаю многим облегчит жизнь Жду ответов... Креативу нет предела ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2005, 00:06 |
|
||
|
FetchRows в zeos или DataSet
|
|||
|---|---|---|---|
|
#18+
в файле известных багов....Zeosa... 6. If you are using dbgrid, all the records will be fetched because of a call to recordcount (in scrollbar). You can avoid this behavior if you turn on the Filtered property. In this case you can achieve fast open even on bigger resultsets. у меня пока нет большой таблицы чтоб проверить... Но если всетаки свойство Filtered установить? интересен эффект! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2005, 18:03 |
|
||
|
FetchRows в zeos или DataSet
|
|||
|---|---|---|---|
|
#18+
Vzhikв файле известных багов....Zeosa... 6. If you are using dbgrid, all the records will be fetched because of a call to recordcount (in scrollbar). You can avoid this behavior if you turn on the Filtered property. In this case you can achieve fast open even on bigger resultsets. у меня пока нет большой таблицы чтоб проверить... Но если всетаки свойство Filtered установить? интересен эффект! Zeos 6.1.5-stable build at 2004-04-29 07:03:04. Запрос на полтора миллиона записей (записи довольно - таки широкие). Открытие ZReadOnlyQuery занимает полторы минуты. Система 2 раза успела сообщить, что увеличен файл подкачки. В процессе открытия на машине работать невозможно. Переключение Filtered не дает никакой реакции. Грид даже не ставил, ни на что не завязанный набор данных (может надо было:-)))?) Естественно, открытие таких больших наборов данных - недостаток и в корректно построенном проекте оно не должно осуществляться. Всегда можно разбить на группы - подгруппы, выводить логически законченными кусками... но даже в этом случае fetch всех записей на клиента весьма раздражает. Привыкли к тому, что любой запрос в оракле - это курсор и клиент ждет только выполнения запроса + выборки первых нескольких записей. 2 фффф: переделывать проект под постраничный вывод данных во всех грида я не буду даже обсуждать. Это корректно для web - проекта, но не для GUI - приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2005, 19:45 |
|
||
|
FetchRows в zeos или DataSet
|
|||
|---|---|---|---|
|
#18+
Поверхостный взгляд на исходники предполагает, что толи драйвер не поддерживает, толи в ЗЕОСЕ пока не релизнули фичу драйвера... А через SQL решили не делать... хотя по моему и самому это сделать не так сложно с помощью эвентов... былоб время на эксперименты.. ЗЫ: мне пока такие объемы не грозят ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2005, 14:04 |
|
||
|
FetchRows в zeos или DataSet
|
|||
|---|---|---|---|
|
#18+
Изучение вопроса показало, что опция DECLARE WITH HOLD появилась в версии 7.4. До неё курсор можно было использовать только внутри транзакции. А держать все время на клиенте открытую транзакцию - плохо. Видимо потому делать работу через курсоры авторы Zeos не стали. И в 7.4/8.0 WITH HOLD тоже не гладко выходит - сервер память начинает кушать при милионных выборках. Я сперва думал, что это он делает только если данные сортируются (по аналогии с static-курсорами в MSSQL) - но похоже что при любом запросе. В feature requests ZeosLib только один запрос на курсоры (правда без указания сервера) - может быть никому это не надо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2005, 10:41 |
|
||
|
FetchRows в zeos или DataSet
|
|||
|---|---|---|---|
|
#18+
Народ, я же предложил решение.... постранично подгружать данные У него есть и минусы конечно такие как работа только в PG но это помоему не беда .... Креативу нет предела ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2005, 10:51 |
|
||
|
FetchRows в zeos или DataSet
|
|||
|---|---|---|---|
|
#18+
2 фффф (мысли вслух): Я понимаю ситуацию так: WITH HOLD эмулирует версионную модель работы, т.е. курсор кэшируется на сервере. Потому и тормозит. Если отбросить этот режим работы, т.е. использовать WITHOUT HOLD, то единственным возможным вариантом поведения клиента будет переоткрытие курсора после Commit с позиционированием на... например на номер записи в курсоре. Насколько я понимаю (а я часто ошибаюсь), то именно так происходит в других серверах при CommitRetaining. Решение данной проблемы в FB - WITHOUT HOLD и долгоиграющая транзакция на чтение, благо количество транзакций на сессию там не ограничено. В Oracle похоже существенно оптимизировали кэширование курсора при его открытии и все курсоры открываются по умолчанию с WITH HOLD. ЗЫ: побейте меня ногами, если всё вышеперечисленное - ересь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2005, 20:27 |
|
||
|
FetchRows в zeos или DataSet
|
|||
|---|---|---|---|
|
#18+
oz2 фффф (мысли вслух): Я понимаю ситуацию так: WITH HOLD эмулирует версионную модель работы, т.е. курсор кэшируется на сервере. Потому и тормозит. Если отбросить этот режим работы, т.е. использовать WITHOUT HOLD, то единственным возможным вариантом поведения клиента будет переоткрытие курсора после Commit с позиционированием на... например на номер записи в курсоре. Насколько я понимаю (а я часто ошибаюсь), то именно так происходит в других серверах при CommitRetaining. Решение данной проблемы в FB - WITHOUT HOLD и долгоиграющая транзакция на чтение, благо количество транзакций на сессию там не ограничено. В Oracle похоже существенно оптимизировали кэширование курсора при его открытии и все курсоры открываются по умолчанию с WITH HOLD. ЗЫ: побейте меня ногами, если всё вышеперечисленное - ересь. Народ, объясните мне темному человеку, как в PG организовывать курсоры и каки образом это можно приминить в ZEOS и решить с помошью этого мою проблему.... Заранее благодарен... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2005, 02:09 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=32998851&tid=2007327]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 260ms |
| total: | 410ms |

| 0 / 0 |
