Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Получить 3 набора записей из функции / 16 сообщений из 16, страница 1 из 1
17.03.2015, 11:14
    #38906791
_avz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить 3 набора записей из функции
С клиента (на delphi) требуется вызвать функцию сервера, которая возвратит 3 множества записей, разумеется с разной структурой. *Важное уточнение: от обмена клиент-сервер требуется максимальное быстродействие, при условии что часть клиентов подключена через медленное соединение.

В PL/pgSQL пока разбираюсь не настолько, чтобы сообразить, возможно ли вернуть их через out-параметры, да и непонятно, как с клиента-то их прочитать. Скорее всего, так нельзя...

Значит, придётся возвратить только один набор, а остальные получить отдельными вызовами. Тогда сервер должен временно сохранить эти наборы до последующих вызовов с клиента. Видимо, следует задействовать временные таблицы? Или лучше, учитывая (*), упаковать эти наборы в bytea - наборы и передать сразу..?

Какая бест-практик в моём случае?
...
Рейтинг: 0 / 0
17.03.2015, 12:35
    #38906921
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить 3 набора записей из функции
_avzС клиента (на delphi) требуется вызвать функцию сервера, которая возвратит 3 множества записей, разумеется с разной структурой. *Важное уточнение: от обмена клиент-сервер требуется максимальное быстродействие, при условии что часть клиентов подключена через медленное соединение.

В PL/pgSQL пока разбираюсь не настолько, чтобы сообразить, возможно ли вернуть их через out-параметры, да и непонятно, как с клиента-то их прочитать. Скорее всего, так нельзя...

Значит, придётся возвратить только один набор, а остальные получить отдельными вызовами. Тогда сервер должен временно сохранить эти наборы до последующих вызовов с клиента. Видимо, следует задействовать временные таблицы? Или лучше, учитывая (*), упаковать эти наборы в bytea - наборы и передать сразу..?

Какая бест-практик в моём случае?

варианта три
1)вернуть 1 большой json ответ
2)вернуть 3 массива составных типов (тот же json просто сериализация другая)
3)вернуть 3 курсора и клиентом затем из них вычитать 3мя дополнительными ззапросами

PS: через out параметры вы задачу не решите. через временные таблицы не советую - очень дорогое решение.
...
Рейтинг: 0 / 0
17.03.2015, 12:35
    #38906922
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить 3 набора записей из функции
_avzС клиента (на delphi) требуется вызвать функцию сервера, которая возвратит 3 множества записей, разумеется с разной структурой.


Этого не может быть, потому что этого не может быть никогда. :-)
В plpg/sql типизация сильная.
Можно конечно извратиться, чтобы одна функция возвращала 3 разных типа, но это будет полный изврат. Так лучше не делать

_avzВ PL/pgSQL пока разбираюсь не настолько, чтобы сообразить, возможно ли вернуть их через out-параметры, да и непонятно, как с клиента-то их прочитать. Скорее всего, так нельзя...


Считайте что нельзя!
Так будет лучше, в т.ч. и вам.

_avz
Значит, придётся возвратить только один набор, а остальные получить отдельными вызовами. Тогда сервер должен временно сохранить эти наборы до последующих вызовов с клиента. Видимо, следует задействовать временные таблицы? Или лучше, учитывая (*), упаковать эти наборы в bytea - наборы и передать сразу..?

Какая бест-практик в моём случае?

Бест-практик в вашем случае выбросить глупости из головы.
Делать нужно правильно!
Т.е. если вам нужно три разных результата, то нужно делать три разных запроса.
...
Рейтинг: 0 / 0
17.03.2015, 12:41
    #38906934
Получить 3 набора записей из функции
_avz,

много букв, мало деталей сути задачи, характеристик и связей результатов.
...
Рейтинг: 0 / 0
17.03.2015, 12:45
    #38906945
?Ы
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить 3 набора записей из функции
_avzС клиента (на delphi) требуется вызвать функцию сервера, которая возвратит 3 множества записей, разумеется с разной структурой. *Важное уточнение: от обмена клиент-сервер требуется максимальное быстродействие, при условии что часть клиентов подключена через медленное соединение.

В PL/pgSQL пока разбираюсь не настолько, чтобы сообразить, возможно ли вернуть их через out-параметры, да и непонятно, как с клиента-то их прочитать. Скорее всего, так нельзя...

Значит, придётся возвратить только один набор, а остальные получить отдельными вызовами. Тогда сервер должен временно сохранить эти наборы до последующих вызовов с клиента. Видимо, следует задействовать временные таблицы? Или лучше, учитывая (*), упаковать эти наборы в bytea - наборы и передать сразу..?

Какая бест-практик в моём случае?а NextRecordset (или что-то около) в ADO отключили ?

есть стандратный бэд паттерн -- открыть три курсора и держать транзакцию открытой с клиента -- распространён у аров-калоедов. но это особенности ара-кала, как вструмента, им диктуют. жалко их
...
Рейтинг: 0 / 0
17.03.2015, 12:55
    #38906960
_avz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить 3 набора записей из функции
Maxim Bogukварианта три
1)вернуть 1 большой json ответдля моего клиента не самое удобное (компоненты pgDAC не поддерживают)
2)вернуть 3 массива составных типов (тот же json просто сериализация другая)Спасибо за идею, посмотрю как с этим в pgDAC, но думаю что придётся вручную разбирать.
3)вернуть 3 курсора и клиентом затем из них вычитать 3мя дополнительными ззапросамиспасибо, поизучаю такую возможность
через временные таблицы не советую - очень дорогое решение. В том смысле, что быстродействие будет не очень? Например, если создать эти темп. таблицы один раз за сессию, а в каждом вызове функции их перезаполнять?
...
Рейтинг: 0 / 0
17.03.2015, 13:00
    #38906970
_avz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить 3 набора записей из функции
mad_nazgulДелать нужно правильно!
Т.е. если вам нужно три разных результата, то нужно делать три разных запроса. Вообще - да, только тогда получится что самый тяжёлый запрос будет выполнен трижды, в то время как в моём случае возможно подобрать все нужные данные, исполнив его единожды.
...
Рейтинг: 0 / 0
17.03.2015, 13:02
    #38906976
_avz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить 3 набора записей из функции
?Ыа NextRecordset (или что-то около) в ADO отключили ? на клиенте используется библиотека pgDAC.
...
Рейтинг: 0 / 0
17.03.2015, 13:10
    #38906994
_avz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить 3 набора записей из функции
запись массивов записей_avz,

много букв, мало деталей сути задачи, характеристик и связей результатов.Деталями задачи грузить не хотелось бы, вопрос больше про возможности, имеющиеся у субд.
...
Рейтинг: 0 / 0
17.03.2015, 13:56
    #38907078
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить 3 набора записей из функции
_avzmad_nazgulДелать нужно правильно!
Т.е. если вам нужно три разных результата, то нужно делать три разных запроса. Вообще - да, только тогда получится что самый тяжёлый запрос будет выполнен трижды, в то время как в моём случае возможно подобрать все нужные данные, исполнив его единожды.

Так сделайте один запрос в котором возвратиться все что надо. :-)
Потом раскидайте по нужным вам спискам.
...
Рейтинг: 0 / 0
17.03.2015, 14:32
    #38907158
_avz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить 3 набора записей из функции
mad_nazgul_avzпропущено...
Вообще - да, только тогда получится что самый тяжёлый запрос будет выполнен трижды, в то время как в моём случае возможно подобрать все нужные данные, исполнив его единожды.

Так сделайте один запрос в котором возвратиться все что надо. :-)
Потом раскидайте по нужным вам спискам.так не получится в рамках одного запроса.
детали, если интересноГрубо говоря, наборы такие: 1) список ид объектов, выбираемых по сложному условию, на отбор которых сервер тратит много времени 2) набор с детальной информацией по объектам из списка 1, причём записей там на порядок меньше. 3)большой объём (много колонок) по небольшой части объектов из списка 1.
Причём на клиентах с медленной (модемной!) связью проверено: один большой запрос на большой блок данных выполняется намного быстрее, чем сотни мелких, забирающих те же данные. Отсюда желание забрать все за один раз.
...
Рейтинг: 0 / 0
17.03.2015, 14:47
    #38907173
?Ы
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить 3 набора записей из функции
_avz,

кста, подумал, если сказать с клиента одним предложением
Код: plsql
1.
2.
3.
4.
5.
6.
BEGIN;
SELECT * FROM returned_3_cursor_function();
FETCH ALL FROM "mycurs1";
FETCH ALL FROM "mycurs2";
FETCH ALL FROM "mycurs3";
END;


то библой с NextRecordset [или аналогом ] можно будет возвраты перебрать, при этом с клиента транзакцию не держать (что всегда чревато висящим "idle in transaction" соединением при отвалившемся клиенте).
...
Рейтинг: 0 / 0
17.03.2015, 14:48
    #38907174
_avz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить 3 набора записей из функции
пока решил второй и третий наборы запаковать на сервере в bytea-блоки, которые будут возвращены через out-параметры и разобраны на клиенте.

Решение не извращения ради, а только для скорости обмена :)
...
Рейтинг: 0 / 0
17.03.2015, 14:49
    #38907177
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить 3 набора записей из функции
_avzнаборы такие: 1) список ид объектов, выбираемых по сложному условию, на отбор которых сервер тратит много времени 2) набор с детальной информацией по объектам из списка 1, причём записей там на порядок меньше. 3)большой объём (много колонок) по небольшой части объектов из списка 1.
Это всё охватывающие множества. Что мешает вернуть один набор из "много колонок", у которого для ненужных объектов в ненужных колонках будет NULL?
...
Рейтинг: 0 / 0
17.03.2015, 14:50
    #38907179
_avz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить 3 набора записей из функции
?Ы_avz,

кста, подумал, если сказать с клиента одним предложением
Код: plsql
1.
2.
3.
4.
5.
6.
BEGIN;
SELECT * FROM returned_3_cursor_function();
FETCH ALL FROM "mycurs1";
FETCH ALL FROM "mycurs2";
FETCH ALL FROM "mycurs3";
END;


то библой с NextRecordset [или аналогом ] можно будет возвраты перебрать, при этом с клиента транзакцию не держать (что всегда чревато висящим "idle in transaction" соединением при отвалившемся клиенте).

Да, я уже подумал над этим вариантом.
...
Рейтинг: 0 / 0
17.03.2015, 14:53
    #38907184
_avz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить 3 набора записей из функции
Dimitry Sibiryakov_avzнаборы такие: 1) список ид объектов, выбираемых по сложному условию, на отбор которых сервер тратит много времени 2) набор с детальной информацией по объектам из списка 1, причём записей там на порядок меньше. 3)большой объём (много колонок) по небольшой части объектов из списка 1.
Что мешает вернуть один набор из "много колонок", у которого для ненужных объектов в ненужных колонках будет NULL? одному объекту может соответствовать несколько деталей, но для большинства (90%) объектов деталей вообще нет.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Получить 3 набора записей из функции / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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