Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Выполнить запрос 1 раз, но получать записи по кускам  [new]
polin11
Member

Откуда:
Сообщений: 150
Использую PostgreSQL, есть большая таблица несколько миллионов записей, для примера
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) с получение записей по частям?
7 ноя 20, 16:58    [22227997]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос 1 раз, но получать записи по кускам  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4396
polin11,

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



--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
7 ноя 20, 18:02    [22228009]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос 1 раз, но получать записи по кускам  [new]
polin11
Member

Откуда:
Сообщений: 150
Maxim Boguk,
Курсорами в Postgresql никогда не пользовался, вы не в курсе
при такой постановке задачи, что запрос нужно выполнить 1 раз, а записи получать частями, подойдут ли
курсоры?
Такой механизм будет оптимальнее (по времени и памяти), нежели просто получить все записи стандартным запросом SQL?

Сообщение было отредактировано: 7 ноя 20, 19:03
7 ноя 20, 19:05    [22228018]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос 1 раз, но получать записи по кускам  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 760
polin11,

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

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

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

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

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

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

Если такое объяснение вам дало представление о назначении и пользе курсоров, вам должно быть легче посмотреть синтаксис и выполнить задание. Там несколько миллионов записей не случайно упомянуты.
7 ноя 20, 19:35    [22228031]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос 1 раз, но получать записи по кускам  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4396
polin11
Maxim Boguk,
Курсорами в Postgresql никогда не пользовался, вы не в курсе
при такой постановке задачи, что запрос нужно выполнить 1 раз, а записи получать частями, подойдут ли
курсоры?
Такой механизм будет оптимальнее (по времени и памяти), нежели просто получить все записи стандартным запросом SQL?


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

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

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
7 ноя 20, 23:23    [22228136]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос 1 раз, но получать записи по кускам  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51772
polin11
Вопрос: Как написать запрос (возможно функцию/запрос на PL/pgSQL) с получение записей по частям?

Это пишется не в запросе или в функции, а в коде, которым вы записи получаете. Для ODBC это будет вызов SQLFetch().
8 ноя 20, 14:38    [22228341]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос 1 раз, но получать записи по кускам  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 2420
>polin11, вчера, 16:58 [22227997]
>Использую PostgreSQL...
<
1. Примерно такой вопрос Яндексу: Postgresql перебрать курсор
2.
3.
8 ноя 20, 18:39    [22228425]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить