powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / FetchRows в zeos или DataSet
13 сообщений из 13, страница 1 из 1
FetchRows в zeos или DataSet
    #32992289
s_elected
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет народ!
Начал работать с PG+Delphi+Zeos и столкнулся с проблемой
При выборке из таблицы (1000000 записей) типа
Код: plaintext
select * from table
тянуться все данные.
конечно можно ограничить вывод limit
но вдруг пользователю всетаки нужно будет больше чем ты поставишь значение в limit.
Отсюда вопрос: Кто нибудь пытался сделать в zeos что-то типа fetch rows которая постранично подгружает данные в Dataset по мере необходимости ?
Так сделано в ODAC MYDAC и многих других компонентах.

Или если кто сталкивался напишите как решали данную проблему...

Заранее благодарен.

Креативу нет предела ;-)
...
Рейтинг: 0 / 0
FetchRows в zeos или DataSet
    #32994901
Фотография oz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Юзаю триалы PostgresDAC. Те же яйца вид сбоку. И та же трабла. Может это проблема на концетпуальном уровне. Шо я только что сказал? Сам не понял.
...
Рейтинг: 0 / 0
FetchRows в zeos или DataSet
    #32995039
фффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня с наскоку сделать такое с Zeos не получилось, но подумав я решил, что мне это не очень и нужно. Аргументы такие:
1) пользователь не увидев в первых 2-3 экранах нужной информации начнет пытаться искать в том же гриде. Если возможность поиска в открытом датасете есть (допустим, используется TDBGridEh с инкрементным поиском по Ctrl+F) - начнет фетчится вся выборка => тормоза у клиента, затык в сети. То есть, вывод в одном датасете всех записей мне представляется излишним. Постраничная же навигация (с ограничением одновременно отображаемых записей) через FETCH FORWARD/FETCH BACKWARD или LIMIT .. OFFSET - делается и без этого.
2) если в объявлении курсора запрос с группировкой/сортировкой, то для курсора сервер вынужден будет выбрать все данные. Если десяток пользователей начнет такие миллионные выборки делать одновременно - туго серверу придется. Все же надо пользователя ограничивать.

В общем, зелен виноград :-)

Еще я не понял, как получить число записей в курсоре. Похоже постгрес такого функционала не дает, может потому и в компонентах для Дельфи курсоры не поддерживаются?
...
Рейтинг: 0 / 0
FetchRows в zeos или DataSet
    #32995200
Фотография oz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
фффф...То есть, вывод в одном датасете всех записей мне представляется излишним. Постраничная же навигация (с ограничением одновременно отображаемых записей) через FETCH FORWARD/FETCH BACKWARD или LIMIT .. OFFSET - делается и без этого.
тут я не понял. Где делается? Кем? Суть топика как раз сводится к тому, что компонентами них.. не делается. Возможно, Вы имеете в виду такую реализацию в своем приложении. Писать компоненты прямого доступа - кул. Яж на это не способный (
фффф2) если в объявлении курсора запрос с группировкой/сортировкой, то для курсора сервер вынужден будет выбрать все данные. Если десяток пользователей начнет такие миллионные выборки делать одновременно - туго серверу придется.
До сих пор разговор шел про разгрузку клиента и сети. Мне необходимо, чтобы после выполнения запроса на сервере я увидел данные. Реально после выполнения запроса я еще жду некоторое количество времени (зависит от размера выборки) пока все данные не закачаются на клиента. Это сакс.
...
Рейтинг: 0 / 0
FetchRows в zeos или DataSet
    #32995467
фффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 с большим оффсетом для сервера может быть и тяжелее чем курсор - тут надо по ситуации глядеть.
...
Рейтинг: 0 / 0
FetchRows в zeos или DataSet
    #32997103
s_elected
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все огромное спасибо за участие в топике
немного проясню ситуацию
Я вижу решение этому такое:

Идея в том, чтобы сам Zeos делал следующее:
тогда когда курсор встает на последнюю позицию Dataset, делается дозапрос типа
Select * from table добавляя вниз ограничение Limit одним словом C - ПО

т.е как бы подгружал следующую страницу и добавлял эти записи в Dataset
Теорию то я придумал, но вот как это реализовать .... ???
Скажем честно? я не смогу разобраться в исходнике Zeos TAbstractDataset
А вот человек который сможет думаю без труда туда вкорячит постраничную подгрузку данных
и соответсвенно параметр типа Fetchrows (колличество строк в странице)

Кстати ODAC и MyDac именно так и сделан (постраничная додгрузка)

Да и еще клевая фича метод RefreshRecord обновляет только текущую строку в DataSet указываешь только условие обновления

Кстати исходники ODAC у меня тоже есть (честно купленные), там все это реализованно, но я там ничерта понять не могу.
Есть у кого нибудь желание сделать такую функциональность Zeos пусть даже только для PG
Я думаю многим облегчит жизнь

Жду ответов...

Креативу нет предела ;-)
...
Рейтинг: 0 / 0
FetchRows в zeos или DataSet
    #32998851
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 установить? интересен эффект!
...
Рейтинг: 0 / 0
FetchRows в zeos или DataSet
    #33001443
Фотография oz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 - приложения.
...
Рейтинг: 0 / 0
FetchRows в zeos или DataSet
    #33002679
Vzhik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поверхостный взгляд на исходники предполагает, что толи драйвер не поддерживает, толи в ЗЕОСЕ пока не релизнули фичу драйвера...
А через SQL решили не делать...

хотя по моему и самому это сделать не так сложно с помощью эвентов... былоб время на эксперименты..

ЗЫ: мне пока такие объемы не грозят ;-)
...
Рейтинг: 0 / 0
FetchRows в zeos или DataSet
    #33004170
фффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изучение вопроса показало, что опция DECLARE WITH HOLD появилась в версии 7.4. До неё курсор можно было использовать только внутри транзакции. А держать все время на клиенте открытую транзакцию - плохо. Видимо потому делать работу через курсоры авторы Zeos не стали.

И в 7.4/8.0 WITH HOLD тоже не гладко выходит - сервер память начинает кушать при милионных выборках. Я сперва думал, что это он делает только если данные сортируются (по аналогии с static-курсорами в MSSQL) - но похоже что при любом запросе.

В feature requests ZeosLib только один запрос на курсоры (правда без указания сервера) - может быть никому это не надо?
...
Рейтинг: 0 / 0
FetchRows в zeos или DataSet
    #33004207
s_elected
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, я же предложил решение....
постранично подгружать данные
У него есть и минусы конечно такие как работа только в PG
но это помоему не беда ....

Креативу нет предела ;-)
...
Рейтинг: 0 / 0
FetchRows в zeos или DataSet
    #33005985
Фотография oz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 фффф (мысли вслух):
Я понимаю ситуацию так: WITH HOLD эмулирует версионную модель работы, т.е. курсор кэшируется на сервере. Потому и тормозит. Если отбросить этот режим работы, т.е. использовать WITHOUT HOLD, то единственным возможным вариантом поведения клиента будет переоткрытие курсора после Commit с позиционированием на... например на номер записи в курсоре. Насколько я понимаю (а я часто ошибаюсь), то именно так происходит в других серверах при CommitRetaining.
Решение данной проблемы в FB - WITHOUT HOLD и долгоиграющая транзакция на чтение, благо количество транзакций на сессию там не ограничено. В Oracle похоже существенно оптимизировали кэширование курсора при его открытии и все курсоры открываются по умолчанию с WITH HOLD.

ЗЫ: побейте меня ногами, если всё вышеперечисленное - ересь.
...
Рейтинг: 0 / 0
FetchRows в zeos или DataSet
    #33006212
s_elected
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oz2 фффф (мысли вслух):
Я понимаю ситуацию так: WITH HOLD эмулирует версионную модель работы, т.е. курсор кэшируется на сервере. Потому и тормозит. Если отбросить этот режим работы, т.е. использовать WITHOUT HOLD, то единственным возможным вариантом поведения клиента будет переоткрытие курсора после Commit с позиционированием на... например на номер записи в курсоре. Насколько я понимаю (а я часто ошибаюсь), то именно так происходит в других серверах при CommitRetaining.
Решение данной проблемы в FB - WITHOUT HOLD и долгоиграющая транзакция на чтение, благо количество транзакций на сессию там не ограничено. В Oracle похоже существенно оптимизировали кэширование курсора при его открытии и все курсоры открываются по умолчанию с WITH HOLD.

ЗЫ: побейте меня ногами, если всё вышеперечисленное - ересь.

Народ, объясните мне темному человеку, как в PG организовывать курсоры
и каки образом это можно приминить в ZEOS
и решить с помошью этого мою проблему....

Заранее благодарен...
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / FetchRows в zeos или DataSet
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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