|
Выполнить запрос 1 раз, но получать записи по кускам
|
|||
---|---|---|---|
#18+
Использую PostgreSQL, есть большая таблица несколько миллионов записей, для примера Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
По заданию от преподавателя нужно запрос выполнить 1 запрос, но записи получать по частям, не надо для него сразу выполнять fetchAll - надо итерировать fetchOne. Нужно результирующую выборку правильно отсортировать уже на уровне самого запроса по полю root. Не смог нагуглить, что такое fetchAll, fetchOne в Postgresql. Что-то похожее описано по курсорам в Postgresql https://postgrespro.ru/docs/postgrespro/9.6/plpgsql-cursors Вопрос: Как написать запрос (возможно функцию/запрос на PL/pgSQL) с получение записей по частям? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2020, 16:58 |
|
Выполнить запрос 1 раз, но получать записи по кускам
|
|||
---|---|---|---|
#18+
polin11, Именно через курсор и надо? Вы через курсор пробовали? -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2020, 18:02 |
|
Выполнить запрос 1 раз, но получать записи по кускам
|
|||
---|---|---|---|
#18+
Maxim Boguk, Курсорами в Postgresql никогда не пользовался, вы не в курсе при такой постановке задачи, что запрос нужно выполнить 1 раз, а записи получать частями, подойдут ли курсоры? Такой механизм будет оптимальнее (по времени и памяти), нежели просто получить все записи стандартным запросом SQL? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2020, 19:05 |
|
Выполнить запрос 1 раз, но получать записи по кускам
|
|||
---|---|---|---|
#18+
polin11, Я отвечу из предположения, что вы хотите научиться но пропустили лекцию где-то. Курсор в другом языке программирования назывался бы итератор. Если вы с итераторами списков/массивов/множеств знакомы, это очень похоже. Он позволяет пошагово пройтись по строчкам результата запроса, не требуя при этом чтобы запрос сразу весь исполнился (потому что весь запрос может быть долгим, или дорогим для памяти, а может вам только первые несколько строчек надо). Практическое применение: поскольку итератор можно передавать в процедуры, вы можете написать процедуру обработки строк резалт сета, и отделить ее от кода нахождения строк в таблице, которых может быть несколько. Без курсора, вам бы пришлось 1) или вставлять код запроса в функцию, и итерировать внутри циклом, 2) или собирать весь запрос во временное хранение (память или таблицу), а потом передавать это в функцию. Первый метод негибкий - для каждого запроса нужна новая функция (хотя можно извернуться через динамический SQL) Второй метод "водопадный" - предусматривает завершение запроса до того как начнется обработка первой строки (хотя тоже есть обходные пути). Если такое объяснение вам дало представление о назначении и пользе курсоров, вам должно быть легче посмотреть синтаксис и выполнить задание. Там несколько миллионов записей не случайно упомянуты. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2020, 19:35 |
|
Выполнить запрос 1 раз, но получать записи по кускам
|
|||
---|---|---|---|
#18+
polin11 Maxim Boguk, Курсорами в Postgresql никогда не пользовался, вы не в курсе при такой постановке задачи, что запрос нужно выполнить 1 раз, а записи получать частями, подойдут ли курсоры? Такой механизм будет оптимальнее (по времени и памяти), нежели просто получить все записи стандартным запросом SQL? >>при такой постановке задачи, что запрос нужно выполнить 1 раз, а записи получать частями, подойдут ли курсоры? да подойдут >>Такой механизм будет оптимальнее (по времени и памяти), нежели просто получить все записи стандартным запросом SQL? По времени - всегда и без вариантов если вам надо весь результат запроса получить то быстрее получить его одним запросом... через курсоры будет от 2 до N раз медленнее (в зависимости от того по сколько строк вы будете из курсора вычитывать за раз... по одной строке - самый медленный случай и легко может и в 1000 раз быть медленнее - все будет от скорости сети зависеть между базой и приложением). По памяти - для приложения безусловно оптимальнее... для базы - бывает по разному (смотря какой запрос... многие запросы все равно приходится выполнять целиком перед тем как хоть одну строку отдать и тогда выигрыша по памяти в базе не будет... если же запрос позволяет выполняться и выдавать результаты построчно - тогда и для базы может быть выигрыш в памяти). -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2020, 23:23 |
|
Выполнить запрос 1 раз, но получать записи по кускам
|
|||
---|---|---|---|
#18+
polin11 Вопрос: Как написать запрос (возможно функцию/запрос на PL/pgSQL) с получение записей по частям? Это пишется не в запросе или в функции, а в коде, которым вы записи получаете. Для ODBC это будет вызов SQLFetch(). ... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2020, 14:38 |
|
Выполнить запрос 1 раз, но получать записи по кускам
|
|||
---|---|---|---|
#18+
>polin11, вчера, 16:58 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1330652&msg=22227997][22227997] >Использую PostgreSQL... < 1. Примерно такой вопрос Яндексу: Postgresql перебрать курсор 2 . 3 . ... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2020, 18:39 |
|
|
start [/forum/topic.php?fid=53&msg=40016263&tid=1994388]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
150ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 259ms |
0 / 0 |