Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Цикл / 23 сообщений из 23, страница 1 из 1
20.09.2021, 21:16
    #40098803
Delphi_Watcher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
Есть таблица скажем с сотней записей. Можно ли как то циклом(или еще как-то) вывести каждую строку с интервалом 1 мин, чтобы запрос работал 100 минут?
...
Рейтинг: 0 / 0
21.09.2021, 12:28
    #40098942
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
Delphi_Watcher,
Код: sql
1.
select pg_sleep(60) from generate_series(1,100);
...
Рейтинг: 0 / 0
21.09.2021, 14:29
    #40098993
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
Павел Лузанов
Delphi_Watcher,
Код: sql
1.
select pg_sleep(60) from generate_series(1,100);



Оно так не работает... тут оно 6000 секунд протупит и потом 100 строк сразу выдаст.
Это была моя первая версия.

Если зачада в psql это сделать то через \watch 60 + курсор можно наколхозить легко.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
21.09.2021, 14:34
    #40098996
Delphi_Watcher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
Павел Лузанов
Delphi_Watcher,
Код: sql
1.
select pg_sleep(60) from generate_series(1,100);


Не работает
...
Рейтинг: 0 / 0
21.09.2021, 16:28
    #40099074
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
Maxim Boguk
Павел Лузанов
Delphi_Watcher,
Код: sql
1.
select pg_sleep(60) from generate_series(1,100);


Оно так не работает... тут оно 6000 секунд протупит и потом 100 строк сразу выдаст.
Это была моя первая версия.

Если зачада в psql это сделать то через \watch 60 + курсор можно наколхозить легко.

Точно, это я застрял на последней фразе "чтобы запрос работал 100 минут". Спасибо за поправку.

Коль нужно выдавать строки с задержкой, то я за "колхозы" с курсором:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
postgres@postgres(12.8)=# \timing on
Timing is on.
postgres@postgres(12.8)=# begin;
BEGIN
Time: 0,109 ms
postgres@postgres(12.8)=*# declare c cursor for select g.x, pg_sleep(1) as s from generate_series(1,3) as g(x);
DECLARE CURSOR
Time: 0,305 ms
postgres@postgres(12.8)=*# fetch c;
 x | s 
---+---
 1 | 
(1 row)

Time: 1001,326 ms (00:01,001)
postgres@postgres(12.8)=*# fetch c;
 x | s 
---+---
 2 | 
(1 row)

Time: 1001,301 ms (00:01,001)
postgres@postgres(12.8)=*# fetch c;
 x | s 
---+---
 3 | 
(1 row)

Time: 1001,255 ms (00:01,001)
postgres@postgres(12.8)=*# fetch c;
 x | s 
---+---
(0 rows)

Time: 0,170 ms
postgres@postgres(12.8)=*# close c;
CLOSE CURSOR
Time: 0,120 ms
postgres@postgres(12.8)=*# commit;
COMMIT
Time: 0,150 ms


Хотя всё зависит от задачи, может и plpgsql с raise notice подойдет:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
postgres@postgres(12.8)=# do $$declare 
    r record;
begin 
    for r in (select g.x, pg_sleep(1) as s from generate_series(1,3) as g(x))
    loop 
        raise notice '%: %',to_char(clock_timestamp(),'HH24:MI:SS'), r.x;
    end loop;
end;$$ ;
NOTICE:  16:25:19: 1
NOTICE:  16:25:20: 2
NOTICE:  16:25:21: 3
DO
...
Рейтинг: 0 / 0
27.09.2021, 19:17
    #40100314
big-trot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
Павел Лузанов

Хотя всё зависит от задачи, может и plpgsql с raise notice подойдет:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
postgres@postgres(12.8)=# do $$declare 
    r record;
begin 
    for r in (select g.x, pg_sleep(1) as s from generate_series(1,3) as g(x))
    loop 
        raise notice '%: %',to_char(clock_timestamp(),'HH24:MI:SS'), r.x;
    end loop;
end;$$ ;
NOTICE:  16:25:19: 1
NOTICE:  16:25:20: 2
NOTICE:  16:25:21: 3
DO



Так тоже не работает. Функция провесит три секунды, а потом выдаст все нотайсы. Через дблинк можно сделать.
...
Рейтинг: 0 / 0
27.09.2021, 19:41
    #40100320
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
big-trot
Функция провесит три секунды, а потом выдаст все нотайсы

Как раз-таки нотайсы будут отправлены вовремя. По сути, именно так работает vacuum verbose как наиболее заметный пример типа-интерактивного-процесса.
Важное слово "отправлены". Может быть ваша библиотека приложения позволяет их получить только после завершения запроса.
...
Рейтинг: 0 / 0
27.09.2021, 22:31
    #40100344
big-trot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
Melkij
Как раз-таки нотайсы будут отправлены вовремя.


Может быть они и будут отправлены вовремя, но клиент эти нотайсы получит сразу все одновременно после завершения работы функции.
...
Рейтинг: 0 / 0
27.09.2021, 22:57
    #40100348
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
big-trot
Melkij
Как раз-таки нотайсы будут отправлены вовремя.


Может быть они и будут отправлены вовремя, но клиент эти нотайсы получит сразу все одновременно после завершения работы функции.


Смотря какой клиент и как он написан... libpq точно имеет нормальные интерфейсы для асинхронной работы с notice и запросами.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
28.09.2021, 10:47
    #40100398
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
big-trot
Melkij
Как раз-таки нотайсы будут отправлены вовремя.


Может быть они и будут отправлены вовремя, но клиент эти нотайсы получит сразу все одновременно после завершения работы функции.

см. psql
Возможность их обработать сразу, не дожидаясь завершения запроса - есть. Реализует ли приложение эту возможность - вопрос очевидно не к базе, а к приложению
...
Рейтинг: 0 / 0
28.09.2021, 11:02
    #40100403
big-trot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
Maxim Boguk
Смотря какой клиент и как он написан


хотя бы psql и на том примере, которые предложил Павел Лузанов.
...
Рейтинг: 0 / 0
28.09.2021, 11:03
    #40100404
crutchmaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
Delphi_Watcher,

Можно поинтересоваться нахрена, а главное, зачем?
...
Рейтинг: 0 / 0
28.09.2021, 11:07
    #40100407
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
big-trot
Maxim Boguk
Смотря какой клиент и как он написан


хотя бы psql и на том примере, которые предложил Павел Лузанов.

Так попробуйте мой пример в psql :-)
...
Рейтинг: 0 / 0
28.09.2021, 11:26
    #40100413
big-trot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
Павел Лузанов
big-trot
пропущено...


хотя бы psql и на том примере, которые предложил Павел Лузанов.

Так попробуйте мой пример в psql :-)


так там и пробывал
...
Рейтинг: 0 / 0
28.09.2021, 14:42
    #40100469
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
big-trot
Павел Лузанов
пропущено...

Так попробуйте мой пример в psql :-)


так там и пробывал

Случаем не через pgbouncer подключаетесь?

Когда psql подключается к postgres напрямую через libpq, то сообщения notice выводятся асинхронно.
...
Рейтинг: 0 / 0
28.09.2021, 14:54
    #40100472
big-trot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
Павел Лузанов
Так попробуйте мой пример в psql :-)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
postgres=# \timing on
Секундомер включён.
postgres=# do $$declare
r record;
begin
for r in (select g.x, pg_sleep(1) as s from generate_series(1,3) as g(x))
loop
raise notice '%: %', to_char (clock_timestamp(),'HH24:MI:SS'), r.x;
end loop;
end;$$ ;
NOTICE:  14:37:14: 1
NOTICE:  14:37:14: 2
NOTICE:  14:37:14: 3
LOG:  duration: 3003.403 ms  statement: do $$declare
r record;
begin
for r in (select g.x, pg_sleep(1) as s from generate_series(1,3) as g(x))
loop
raise notice '%: %', to_char (clock_timestamp(),'HH24:MI:SS'), r.x;
end loop;
end;$$ ;
DO
Время: 3003,478 мс
postgres=#



версия 9.6
...
Рейтинг: 0 / 0
28.09.2021, 15:02
    #40100474
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
big-trot,

На 13 версии notice показываются раз в секунду как и должно быть.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
28.09.2021, 15:09
    #40100477
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
Павел Лузанов
Случаем не через pgbouncer подключаетесь?

И всё-таки?
Хотя бы вывод \conninfo покажите.
...
Рейтинг: 0 / 0
28.09.2021, 16:14
    #40100497
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
Собрал 9.6

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
psql (9.6.23)
Type "help" for help.

postgres=# do $$declare
postgres$# r record;
postgres$# begin
postgres$# for r in (select g.x, pg_sleep(1) as s from generate_series(1,3) as g(x))
postgres$# loop
postgres$# raise notice '%: %', to_char (clock_timestamp(),'HH24:MI:SS'), r.x;
postgres$# end loop;
postgres$# end;$$ 
postgres-# ;
NOTICE:  16:09:05: 1
NOTICE:  16:09:05: 2
NOTICE:  16:09:05: 3
DO

Внимание на результаты clock_timestamp. Что говорит не о том, что notice были отправлены с окончанием запроса, а о том, что for r in (select ...) сначала выполнил весь запрос и лишь потом начал выдавать строки результата.
Если перенести sleep в тело цикла, то возвращаемся к
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
postgres=# do $$declare
r record;
begin
for r in (select g.x from generate_series(1,3) as g(x))
loop
perform pg_sleep(1);
raise notice '%: %', to_char (clock_timestamp(),'HH24:MI:SS'), r.x;
end loop;
end;$$ ;
NOTICE:  16:13:05: 1
NOTICE:  16:13:06: 2
NOTICE:  16:13:07: 3
DO
...
Рейтинг: 0 / 0
29.09.2021, 11:58
    #40100631
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
Melkij

Внимание на результаты clock_timestamp. Что говорит не о том, что notice были отправлены с окончанием запроса, а о том, что for r in (select ...) сначала выполнил весь запрос и лишь потом начал выдавать строки результата.

Сергей, спасибо что не поленился и разобрался. А то думал чудеса какие-то. (Но в случае с pgbouncer поведение такое же: сообщения выводятся разом в конце с одинаковым временем.)
Оказалось, что мой пример работает только начиная с 13 версии. Предположительно благодаря вот этому изменению.
...
Рейтинг: 0 / 0
29.09.2021, 12:10
    #40100635
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
Павел Лузанов
Но в случае с pgbouncer поведение такое же: сообщения выводятся разом в конце с одинаковым временем

Мимоходом вчера глянул - не смог воспроизвести, корректно прилетают notice. Ну и раз время одинаковое - значит опять же не баунсера задержка.
...
Рейтинг: 0 / 0
29.09.2021, 12:44
    #40100651
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
Melkij
Павел Лузанов
Но в случае с pgbouncer поведение такое же: сообщения выводятся разом в конце с одинаковым временем

Мимоходом вчера глянул - не смог воспроизвести, корректно прилетают notice. Ну и раз время одинаковое - значит опять же не баунсера задержка.

И еще раз спасибо. Я же на 12 версии проверял :-)

В общем, хорошо когда удается разобраться и не оставлять непонятных мест.
...
Рейтинг: 0 / 0
30.09.2021, 15:51
    #40101014
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл
Павел Лузанов
Оказалось, что мой пример работает только начиная с 13 версии. Предположительно благодаря вот этому изменению.

Понимаю, что к начальному вопросу отношения не имеет, но уж коли началось...

Почуял неладное, когда увидел, что мой пример на 12.8 (последняя версия) и 12.5 работает по-разному. В 12.5 все три строки в конце разом с одним временем выдаются, а в 12.8 - через секунду. Ну потом увидел что и на 13.2 (февральская версия) работает как и на 12.5. Стало ясно, что дело где-то в патче для минорной версии, портированном назад.

Поиски привели к майскому коммиту f21fadafaf0fb5ea4c9622d915972651273d62ce .
И только тут я вспомнил, что цикл for с курсором выбирает записи не по одной, а по 10, чтобы ускорить обработку. Оказалось, что после появления процедур с коммитами внутри такой prefetch может быть не безопасен и его отменили. Поэтому патч портировали назад вплоть до 11 версии, где процедуры появились.

Ну а prefetch по 10 строк легко проверить этим же запросом на любой "старой" версии:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
postgres@postgres(10.18)=# do $$declare
    r record;
begin
    for r in (select g.x, pg_sleep(1) as s from generate_series(1,13) as g(x))
    loop
        raise notice '%: %',to_char(clock_timestamp(),'HH24:MI:SS'), r.x;
    end loop;
end;$$ ;
NOTICE:  15:33:39: 1
NOTICE:  15:33:39: 2
NOTICE:  15:33:39: 3
NOTICE:  15:33:39: 4
NOTICE:  15:33:39: 5
NOTICE:  15:33:39: 6
NOTICE:  15:33:39: 7
NOTICE:  15:33:39: 8
NOTICE:  15:33:39: 9
NOTICE:  15:33:39: 10
NOTICE:  15:33:42: 11
NOTICE:  15:33:42: 12
NOTICE:  15:33:42: 13
DO
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Цикл / 23 сообщений из 23, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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