172 похожих чатов

Ребят, обязательно ли в postgresql курсоры создавать и использовать внутри

коммитов, от begin до commit?

36 ответов

80 просмотров

да

Владимир-/ WDeath Автор вопроса

Нашёл выполнил без транзакции, ошибка "ERROR: DECLARE CURSOR can only be used in transaction blocks"

можно hold но транззакцию это не отммееняет

Владимир-/ WDeath Автор вопроса
Konstantin Zaitsev
можно hold но транззакцию это не отммееняет

Ну курсор создаётся внутри транзации, и умирает потом при закрытии транзацкции? А нормально ли будет держать транзацкию несколько минут, для пользователей которые совершают множественные запросы http Пагинацию делают вообще через курсоры?

Владимир / WDeath
Ну курсор создаётся внутри транзации, и умирает по...

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

Владимир-/ WDeath Автор вопроса

Запрос от пользователя с различными параметрами сортировки. Есть поля, по которым часто меняются данные. Время обновление объекта, и при простом оффсет и лимит, данные меняются местами и путаются Сеньор мой говорит, что курсор решит проблему

Разве? По-моему, он просто весь результат получал и хранил в памяти, нет?

Ilya Anfimov
Разве? По-моему, он просто весь результат получал ...

да, но он сохраняет результтат после завршения ттранзакции

Владимир / WDeath
Ну курсор создаётся внутри транзации, и умирает по...

Unless WITH HOLD is specified, the cursor created by this command can only be used within the current transaction. Thus, DECLARE without WITH HOLD is useless outside a transaction block … If WITH HOLD is specified and the transaction that created the cursor successfully commits, the cursor can continue to be accessed by subsequent transactions in the same session. https://www.postgresql.org/docs/current/sql-declare.html

Владимир-/ WDeath Автор вопроса
Виктор Егоров
Unless WITH HOLD is specified, the cursor created ...

Еее, огонь) Понял как делать. Теперь вопрос, почему плохо через курсор делать пагинацию для пользователя лично свой?

Владимир / WDeath
Запрос от пользователя с различными параметрами с...

Тут надо аккуратнее: удерживая транзакцию(снапшот) дольше некого времени вы можете спровоцировать общее падение производительности сервера. Лично видел стабильно встававший колом сервер при транзации дольше двух минут.

Владимир / WDeath
Еее, огонь) Понял как делать. Теперь вопрос, почем...

не плохо и не хорошо, hold ттребует памяти, без него выше написал Роман

Владимир / WDeath
Запрос от пользователя с различными параметрами с...

Вообще, сколько видел пагинаций, там вполне нормальной является ситуация, что данные сдвигаются. Мол, перешел на следующую страницу, а там подтянулись данные с прошлой, потому что кто-то добавил новую запись. Если прям так нужно, может быть стоит посмотреть в сторону кеширования идентификаторов? От задачи, конечно, зависит.

Владимир / WDeath
Еее, огонь) Понял как делать. Теперь вопрос, почем...

https://use-the-index-luke.com/no-offset вверху есть ссылка на переводы

Владимир-/ WDeath Автор вопроса
Виктор Егоров
https://use-the-index-luke.com/no-offset вверху ес...

По ключам не вариант. Инндексы не на всех полях, которые юзер может сортировать + 2 джойна с другими таблицами, на которых тоже может быть сортировка. Сортировка может быть на колонке со статусами, а статусы 3 на 10000 записей, значит нужно ещё отсортировать второй раз, базово по id, например, чтобы не сбивался порядок при обновлении записей. Как я заметил, обновление записи смешает результат к концу, при равных условиях сортировки По этому пропуск и ограничение тут как удобный вариант, и курсор для фиксирования результата и перемещения по нему с начала до конца. И так же от id по лимиту дальше не сработает, ибо перемешение идёт Такие вот дела

Владимир / WDeath
По ключам не вариант. Инндексы не на всех полях, к...

>По ключам не вариант. Вариант. Но, в любом случае, если хотите какой-то кэш — ну, сделайте таблицу, сделайте её temporary или unlogged, не знаю, и удаляйте периодически. Не надо пытаться хранить что-то в долгую в курсорах. Курсоры были сделаны чтобы получать результат, который не влез бы в память, нередко полезны ещё в этом качестве — и не очень поддержываются сообществом для чего бы то ни было ещё.

Владимир / WDeath
По ключам не вариант. Инндексы не на всех полях, к...

> нужно ещё отсортировать второй раз, базово по id, Ну, отсортируйте, какая вам вообще разница?

Ilya Anfimov
>По ключам не вариант. Вариант. Но, в любом слу...

плохо что не поддерживаются, удобный механизм

Владимир / WDeath
По ключам не вариант. Инндексы не на всех полях, к...

Вообще, temporary таблица лучшэ примерно всем. Но это тожэ очень плохой вариант — поскольку получается, что сэссия пользователя привязана к сэссии постгрес, добиться такой привязки в типичном http — довольно сложно и болезненно.

Ilya Anfimov
Вообще, temporary таблица лучшэ примерно всем. Но...

не лучшше она) лучшше только в реализации Pg(((((

Konstantin Zaitsev
плохо что не поддерживаются, удобный механизм

Я не вижу вообще ничего в них хорошэго. 30 лет назад это примерно соответствовало паттэрну работы с базами данных. Сэссии, таблички на мониторах, курсором (pun intended) пользователь их листает... Сейчас общий пейзаж несколько поменялся.

Konstantin Zaitsev
не лучшше она) лучшше только в реализации Pg(((((

(Посмотрев на названия чятика) Ну да, мы тут вроде не foxbase обсуждаем.

Всё через web, сэссии — виртуальные, жывут странное время, плюс их можэт быть много, запросы к апп-серверу — обычно ограничены по времени, вот это всё.

Если нужна пагинация без повторов показанных строк, тогда зафиксируйте id строки, с которой начали показ и дальше limit + offset + where id >= value

Владимир-/ WDeath Автор вопроса
Kairat
Если нужна пагинация без повторов показанных строк...

Какой ещё offset, если там id >= value? Ну, и человек справедливо объяснил — у него не по id отсортировано. И дажэ не по дате (с которой id обычно коррелирует примерно в 1, потому можно искать по id, когда человек хотел дату). Впрочем, в этом случае границами будут поля сортировки, понятно.

Ilya Anfimov
Всё через web, сэссии — виртуальные, жывут странно...

да заказикам пофиг на эти рассуждения ))))) отсутствие курсоров вне транзакций это плохо))) но сообщество будет говорить как вы я понимаю

Владимир-/ WDeath Автор вопроса
Kairat
Какая?

Сортировка то не по id

Konstantin Zaitsev
да заказикам пофиг на эти рассуждения ))))) отсутс...

ммм… почему вы считаете, что они отсутствуют вне транакций?

Konstantin Zaitsev
а как без hold?

нужен WITH HOLD, ну и используйте. в чём проблема?

Владимир-/ WDeath Автор вопроса
Ilya Anfimov
Какой ещё offset, если там id >= value? Ну, и чел...

Дата обновление записи. Увы, раз в секунду обновляется состояние 10 записей, а их тысячи. И клиентская часть хочет выгрузить всë, по страницам. Из-за сети это занимает до 10с

Виктор Егоров
нужен WITH HOLD, ну и используйте. в чём проблема?

проблема в том зачем курсору транзакция? ))))

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта