powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выполнить запрос 1 раз, но получать записи по кускам
7 сообщений из 7, страница 1 из 1
Выполнить запрос 1 раз, но получать записи по кускам
    #40016226
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Использую PostgreSQL, есть большая таблица несколько миллионов записей, для примера
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE towns
(
    id  INTEGER PRIMARY KEY,
    name CHARACTER VARYING(30),
    root INTEGER
);
INSERT INTO towns VALUES (1, 'Berlin', 1);
INSERT INTO towns VALUES (2, 'Rome', 2);
INSERT INTO towns VALUES (3, 'Paris', 1);
INSERT INTO towns VALUES (1, 'Turin', 2);



По заданию от преподавателя нужно запрос выполнить 1 запрос, но записи получать по частям, не надо для него сразу выполнять fetchAll - надо итерировать fetchOne.
Нужно результирующую выборку правильно отсортировать уже на уровне самого запроса по полю root.

Не смог нагуглить, что такое fetchAll, fetchOne в Postgresql.
Что-то похожее описано по курсорам в Postgresql
https://postgrespro.ru/docs/postgrespro/9.6/plpgsql-cursors

Вопрос: Как написать запрос (возможно функцию/запрос на PL/pgSQL) с получение записей по частям?
...
Рейтинг: 0 / 0
Выполнить запрос 1 раз, но получать записи по кускам
    #40016235
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11,

Именно через курсор и надо?
Вы через курсор пробовали?



--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Выполнить запрос 1 раз, но получать записи по кускам
    #40016238
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,
Курсорами в Postgresql никогда не пользовался, вы не в курсе
при такой постановке задачи, что запрос нужно выполнить 1 раз, а записи получать частями, подойдут ли
курсоры?
Такой механизм будет оптимальнее (по времени и памяти), нежели просто получить все записи стандартным запросом SQL?
...
Рейтинг: 0 / 0
Выполнить запрос 1 раз, но получать записи по кускам
    #40016242
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
polin11,

Я отвечу из предположения, что вы хотите научиться но пропустили лекцию где-то.

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

Он позволяет пошагово пройтись по строчкам результата запроса, не требуя при этом чтобы запрос сразу весь исполнился (потому что весь запрос может быть долгим, или дорогим для памяти, а может вам только первые несколько строчек надо).

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

Без курсора, вам бы пришлось
1) или вставлять код запроса в функцию, и итерировать внутри циклом,
2) или собирать весь запрос во временное хранение (память или таблицу), а потом передавать это в функцию.

Первый метод негибкий - для каждого запроса нужна новая функция (хотя можно извернуться через динамический SQL)
Второй метод "водопадный" - предусматривает завершение запроса до того как начнется обработка первой строки (хотя тоже есть обходные пути).

Если такое объяснение вам дало представление о назначении и пользе курсоров, вам должно быть легче посмотреть синтаксис и выполнить задание. Там несколько миллионов записей не случайно упомянуты.
...
Рейтинг: 0 / 0
Выполнить запрос 1 раз, но получать записи по кускам
    #40016263
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11
Maxim Boguk,
Курсорами в Postgresql никогда не пользовался, вы не в курсе
при такой постановке задачи, что запрос нужно выполнить 1 раз, а записи получать частями, подойдут ли
курсоры?
Такой механизм будет оптимальнее (по времени и памяти), нежели просто получить все записи стандартным запросом SQL?


>>при такой постановке задачи, что запрос нужно выполнить 1 раз, а записи получать частями, подойдут ли
курсоры?
да подойдут

>>Такой механизм будет оптимальнее (по времени и памяти), нежели просто получить все записи стандартным запросом SQL?
По времени - всегда и без вариантов если вам надо весь результат запроса получить то быстрее получить его одним запросом... через курсоры будет от 2 до N раз медленнее (в зависимости от того по сколько строк вы будете из курсора вычитывать за раз... по одной строке - самый медленный случай и легко может и в 1000 раз быть медленнее - все будет от скорости сети зависеть между базой и приложением).
По памяти - для приложения безусловно оптимальнее... для базы - бывает по разному (смотря какой запрос... многие запросы все равно приходится выполнять целиком перед тем как хоть одну строку отдать и тогда выигрыша по памяти в базе не будет... если же запрос позволяет выполняться и выдавать результаты построчно - тогда и для базы может быть выигрыш в памяти).

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Выполнить запрос 1 раз, но получать записи по кускам
    #40016326
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11
Вопрос: Как написать запрос (возможно функцию/запрос на PL/pgSQL) с получение записей по частям?

Это пишется не в запросе или в функции, а в коде, которым вы записи получаете. Для ODBC это будет вызов SQLFetch().
...
Рейтинг: 0 / 0
Выполнить запрос 1 раз, но получать записи по кускам
    #40016361
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>polin11, вчера, 16:58 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1330652&msg=22227997][22227997]
>Использую PostgreSQL...
<
1. Примерно такой вопрос Яндексу: Postgresql перебрать курсор
2 .
3 .
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выполнить запрос 1 раз, но получать записи по кускам
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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