powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вопрос по выполнению анонимного блока
22 сообщений из 22, страница 1 из 1
Вопрос по выполнению анонимного блока
    #39149029
Бока
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вне функции определен type
Код: plaintext
1.
Create type type1 as
(Oldid text, newid text);
А внутри функции сделать следующее
авторDeclare
_arr type1[];
...
PREPARE blk_upd (type1[]) AS
do $$
declare v_sql text;
r type1;
begin
Foreach r in array $1
Loop
v_sql := v_sql||'update table tbl1 set id = '||r.newid||' where id = '||r.oldid||'; '||chr(13)||chr(10);
End loop;
Execute v_sql;
Commit;
End; $$;
EXECUTE blk_upd (_arr);

Будет ли этот блок работать ?
И выполнится ли в этом блоке 10000 сконкатенированных апдейтов?
...
Рейтинг: 0 / 0
Вопрос по выполнению анонимного блока
    #39149073
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бока,

эко хитрО заходите.
блок do всегда был "void returning функцией БЕЗ параметров"
(чего иногда моловато)

м.б. сейчас что--то меняется, если да -- то ткните в ссыль.

но заявка (запихать DO в PREPARE [, а тем паче пропихнуть параметр sql.EXECUTE--контекста неявно в DO]) интересная.
думаю, работать не будет, до тех пор , пока вместо do вы не напишете CREATE OR REPLACE function my_do(my_params).
...
Рейтинг: 0 / 0
Вопрос по выполнению анонимного блока
    #39149077
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS полез проверять RTFM:

http://www.postgresql.org/docs/current/static/sql-prepare.html statement
Any SELECT, INSERT, UPDATE, DELETE, or VALUES statement.


-- т.е. никаких DO [или COPY , что бывает актуально для джобов] в DO 9.5. не предвидится.
...
Рейтинг: 0 / 0
Вопрос по выполнению анонимного блока
    #39149078
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqPS полез проверять RTFM:

http://www.postgresql.org/docs/current/static/sql-prepare.html statement
Any SELECT, INSERT, UPDATE, DELETE, or VALUES statement.


-- т.е. никаких DO [или COPY , что бывает актуально для джобов] в DO PREPARE 9.5. не предвидится.
-- fixed
...
Рейтинг: 0 / 0
Вопрос по выполнению анонимного блока
    #39149152
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БокаЕсли вне функции определен type
Код: plaintext
1.
Create type type1 as
(Oldid text, newid text);
А внутри функции сделать следующее
авторDeclare
_arr type1[];
...
PREPARE blk_upd (type1[]) AS
do $$
declare v_sql text;
r type1;
begin
Foreach r in array $1
Loop
v_sql := v_sql||'update table tbl1 set id = '||r.newid||' where id = '||r.oldid||'; '||chr(13)||chr(10);
End loop;
Execute v_sql;
Commit;
End; $$;
EXECUTE blk_upd (_arr);

Будет ли этот блок работать ?
И выполнится ли в этом блоке 10000 сконкатенированных апдейтов?

Работать не будет. Но вы такое странное написали что я даже затрудняюсь понять а что вы собственно хотите сделать и главное зачем?
Поэтому посоветовать ничего умного не могу.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Вопрос по выполнению анонимного блока
    #39149158
Бока
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

Я еще забыл обрамить сконкатенированный набор update-ов операторными скобками
Код: plaintext
begin; ... end;
, чтобы выполнить
Код: plaintext
execute v_sql;
как бэтч.
Выполнится ли вот такая конструкция:
Declare
_arr type1[];
...
PREPARE blk_upd (type1[]) AS
declare v_sql text;
r type1;
begin
V_sql := 'begin; '||chr(13)||chr(10);
Foreach r in array $1
Loop
v_sql := v_sql||'update table tbl1 set id = '||r.newid||' where id = '||r.oldid||'; '||chr(13)||chr(10);
End loop;
V_sql := v_sql||'end;'
Execute v_sql;
Commit;
End;
EXECUTE blk_upd (_arr);
Или сделать sub-function, в которой сконкатенировать бэтч [FIX]begin; .... end; [/FIX] в техтовой переменной и сделать его execute?
...
Рейтинг: 0 / 0
Вопрос по выполнению анонимного блока
    #39149171
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бока,

вы читаете, что вам отвечают ?

выше приведён ИСЧЕРПЫВАЮЩИЙ, ять, список допустимых инструкций PREPARED--statement-а. (там выпал WITH как [многочленистый] частный случай, который шире своего последнего стейтмента -- вот он ещё м.б.).

всё остальное попросту не пролезет через синтакс парсер

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
PREPARE FOO AS 
DO $$ SELECT 1 ; $$;
EXECUTE FOO;
--------------------------------
ERROR:  syntax error at or near "DO"
LINE 2: DO $$ SELECT 1 ; $$;
        ^

********** Ошибка **********

ERROR: syntax error at or near "DO"
SQL-состояние: 42601
Символ: 17



не надо придумывать то, чего нет.
ваш удел -- пользователь предоставленных интерфейсов [синтакса]
(хотя от разрабов хотелось бы и приятных неожиданностей)
...
Рейтинг: 0 / 0
Вопрос по выполнению анонимного блока
    #39149290
Бока
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

цель заменить значения клюей в таблице согласно парам (старое значение - новое значение в двумерном массиве.
Я предполагаю, что бэтч будет работать быстрее, поэтому:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
_arr type1[];
 v_sql text;
r type1;
...
v_sql := 'begin; '||chr(13)||chr(10);
Foreach r in array _arr
Loop
v_sql := v_sql||'update table tbl1 set id = '||r.newid||' where id = '||r.oldid||'; '||chr(13)||chr(10);
End loop;
v_sql := 'end; ';
Execute v_sql;
Commit;


будет ли это внутри функции работать ?

Или же делать отдельно каждый update в каждой итерации цикла
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
_arr type1[];
 v_sql text;
r type1;
...
Foreach r in array _arr
Loop
v_sql := 'update table tbl1 set id = '||r.newid||' where id = '||r.oldid||'; '||chr(13)||chr(10);
Execute v_sql;
End loop;
Commit;

??

Можете подсказать что-нибудь в этом контексте?
...
Рейтинг: 0 / 0
Вопрос по выполнению анонимного блока
    #39149298
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бока,

COMMIT в plpgSQL отсутствует как класс. напрочь. (но есть обещания на будущее)

см . тут.
http://www.postgresql.org/docs/9.5/static/plpgsql-porting.html#CO.PLPGSQL-PORTING-COMMIT

всё, что они делают "вместо" -- всё неверно, за это им руки из жопы надо выдрать.
и не допускать до писания куроводства

потому как автономии вполне себе эмулируются (не без грабель) в dblink--е

я же предлагал вам подключить tbl1 как FOREIGN TABLE используя postgres_fdw -- должно хорошо автономность получиться, без всяких commit-ов

см
http://www.postgresql.org/docs/9.5/static/postgres-fdw.html
...
Рейтинг: 0 / 0
Вопрос по выполнению анонимного блока
    #39149302
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БокаЯ предполагаю, что бэтч будет работать быстреебыстрее работает обычно то, что проще, то есть один апдейт без plpgsql и вывертов с промежуточными коммитами.
...
Рейтинг: 0 / 0
Вопрос по выполнению анонимного блока
    #39149384
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.БокаЯ предполагаю, что бэтч будет работать быстреебыстрее работает обычно то, что проще, то есть один апдейт без plpgsql и вывертов с промежуточными коммитами.есть разные "обычно"

обычно сильно используемая таблица не любит апдейтов 10^6--10^8 записей за раз -- т.к. за ним, апдейтом на часы (а если там, не дай, ещё и триггера пишут в исчисляемые, да по гирлянде -- то и сутки) , почему-то пользователи в очередь утыкаются.
в очередь на разделяемый ресурс.

Поэтому задачу "отапдейтить немеряно строк" выполняют коротенькими автономиями. иногда даже сам цыкл запуская в другой БД (или вообще снаружи -- в клиенте каком--то). А чтобы при крахах стартовать только по хвосту -- ещё и продумывают протоколирование достигнутого (если оно там в атвомате не получается). ТС просто никогда этого не делал -- вот и мается неделю. там один раз написать -- и больше думать не надо -- просто в рефлексы перевести.
...
Рейтинг: 0 / 0
Вопрос по выполнению анонимного блока
    #39149449
Бока
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.,

Весь процесс - это обрвботка группы таблиц с десТками миллионов записей в каждой. Один апдейт я уже делао, он завис
...
Рейтинг: 0 / 0
Вопрос по выполнению анонимного блока
    #39149453
Бока
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

Хорошо попробую автономку
...
Рейтинг: 0 / 0
Вопрос по выполнению анонимного блока
    #39149467
Бока
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,
Я действительно раньше с особо большими твблмцами не работал, но маючь не неделю - эта рвбрта у меня по совместиткльству , вчера на форум захоодил с телефона , нахрлясь на другой работе
...
Рейтинг: 0 / 0
Вопрос по выполнению анонимного блока
    #39149474
Бока
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

А в автономке как лучше:
- апдайт одной записи в уаждой итеоации цикла ?
- апдэйт бэтчем "begin; ... end;" ?
- или один апдэйт на всю таблицу ?
...
Рейтинг: 0 / 0
Вопрос по выполнению анонимного блока
    #39149484
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бока,

3. зачем вам автономка на один большой апдейт всей таблицы ?
2. если вы в своём коде напишете
Код: sql
1.
2.
update tbl1_foreign SET ...
WHERE tbl1_foreign_id = ANY(my_array_id_part) 


-- у вас автоматом получится автономка размером с длину my_array_id_part
1. то же , но без собирания в [частичные] массивы.

по самим вопросам -- it depends. есть обычно некий размер оптимальной порции, когда вы не тратитесь на излишне частые транзакции - с одной, на излишне большие (с очередями других пользователей) -- с другой. позаписно легче в коде. на пару строчек и немного мысли. батчами -- настраиваемее.


у вас какие-то проблемы с макетированием задумок. это все моментально собирается на коленке на тестовом. и тестируется "что лучше" в вашем случае.
...
Рейтинг: 0 / 0
Вопрос по выполнению анонимного блока
    #39149498
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БокаОдин апдейт я уже делао, он зависОбновить 10млн строк при скромной скорости записи 10МБ/сек займет секунд, сколько средний размер строки в байтах. Строка 300 байт, значит 5 минут.
Построчный проход в цикле увеличит время в несколько раз. Поштучный доступ к элементам десятимиллионного массива - умножить еще на цать.
...
Рейтинг: 0 / 0
Вопрос по выполнению анонимного блока
    #39149660
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.БокаОдин апдейт я уже делао, он зависОбновить 10млн строк при скромной скорости записи 10МБ/сек займет секунд, сколько средний размер строки в байтах. Строка 300 байт, значит 5 минут.
Построчный проход в цикле увеличит время в несколько раз. Поштучный доступ к элементам десятимиллионного массива - умножить еще на цать.
рассуждения если и годные -- то для insert.

после update одним куском у меня будет таки 2 изменённых кучи -- одна -- дедровсов -- с измененным xmax вторая -- новых записей .
а сколько ещё локов придётся поставить ?


не говоря о том, что при наличии дополнительно ON EACH ROW логики мы сразу опускаемся на землю -- там эта логика может жрать много больше, чем наши прикидки. процесс сразу становится буквально по-записным, и без нашего участия. и всё это время конкуренты сосут лапу в очереди.
...
Рейтинг: 0 / 0
Вопрос по выполнению анонимного блока
    #39149674
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
DROP TABLE IF EXISTS test.b;

CREATE TABLE test.b
(
  id serial PRIMARY KEY
  ,fld text
)
WITH (
  OIDS=FALSE
);

INSERT INTO test.b SELECT g, 
$$!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~&#128;&#129;&#130;&#131;&#132;&#133;&#134;&#135;&#136;&#137;&#138;&#139;&#140;&#141;&#142;&#143;&#144;&#145;&#146;&#147;&#148;&#149;&#150;&#151;˜&#153;&#154;&#155;&#156;&#157;&#158;&#159; &#161;&#162;&#163;¤&#165;¦§&#168;©&#170;«¬­®&#175;°±&#178;&#179;&#180;µ¶·&#184;&#185;&#186;»&#188;&#189;&#190;&#191;&#192;&#193;&#194;&#195;&#196;&#197;&#198;&#199;&#200;&#201;&#202;&#203;&#204;&#205;&#206;&#207;&#208;&#209;&#210;&#211;&#212;&#213;&#214;&#215;&#216;&#217;&#218;&#219;&#220;&#221;&#222;&#223;&#224;&#225;&#226;&#227;&#228;&#229;&#230;&#231;&#232;&#233;&#234;&#235;&#236;&#237;&#238;&#239;&#240;&#241;&#242;&#243;&#244;&#245;&#246;&#247;&#248;&#249;&#250;&#251;&#252;&#253;&#254;&#255;&#256;&#257;&#258;&#259;&#260;&#261;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#270;&#271;&#272;&#273;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#292;&#293;&#294;&#295;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#305;&#306;&#307;&#308;&#309;&#310;&#311;&#312;&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#323;&#324;&#325;&#326;&#327;&#328;&#329;&#330;&#331;&#332;$$ 
FROM generate_series(1, 5000000) g
/*
Запрос успешно выполнен: 5000000 строк изменено за 186889 мс.
*/

---------
UPDATE test.b SET id = -id;
/*
Запрос успешно выполнен: 5000000 строк изменено за 540818 мс.
*/




-- т.е k>2 (к прямым "прикидкам") уже в простейшем случае. без явной on each row логики.
...
Рейтинг: 0 / 0
Вопрос по выполнению анонимного блока
    #39149695
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.БокаОдин апдейт я уже делао, он зависОбновить 10млн строк при скромной скорости записи 10МБ/сек займет секунд, сколько средний размер строки в байтах. Строка 300 байт, значит 5 минут.
Построчный проход в цикле увеличит время в несколько раз. Поштучный доступ к элементам десятимиллионного массива - умножить еще на цать.

в общем случае некорректная оценка, когда таблицы и индексы в память не помещаются.
помимо записи в wal'ы (и записи будет больше) нужно строки сначала прочитать, а это сначала random io в индекс, потом в таблицу. причем читаем за раз не одну строку, а страницу 8кб, и нужные строки могут быть по всей таблице разбросаны. если размер таблицы >> размера памяти, диски не ssd и есть еще нагрузка, то обновлять 10М строк можно вечность.

Бока,

не совсем понятно, зачем так усложнять. создаем таблицу с 10М строк, дальше пишем цикл на любом языке и обновляем нужную таблицу батчами по 100-10000 строк.
обновлять можно прям одним запросом с cte, который выберет из таблицы x строк, удалит их, и сделает на основе них update.
...
Рейтинг: 0 / 0
Вопрос по выполнению анонимного блока
    #39149872
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexiusв общем случае некорректная оценка, когда таблицы и индексы в память не помещаются.
помимо записи в wal'ы (и записи будет больше) нужно строки сначала прочитать, а это сначала random io в индекс, потом в таблицу. причем читаем за раз не одну строку, а страницу 8кб, и нужные строки могут быть по всей таблице разбросаны. если размер таблицы >> размера памяти, диски не ssd и есть еще нагрузка, то обновлять 10М строк можно вечность.Для полного обновления значительная память не требуется. Может посодействовать, когда на самом обновляемом поле есть индекс. Целевая скорость последовательного апдейта 10МБ/сек достаточно заурядна для серверов с недесктопным диском, не говоря уже о рейде с несколькими дисками. На моем ноутбучном hdd апдейт поля без индекса (pk у qwwq) 5м строк/1.7гб - 5 минут. На сервере, используемом для разработки, - 33 сек.
По поводу конкурентной нагрузки, наивно полагать, что допустившие к системе такого специалиста по базам данных, как Бока, способны оценить компетентность советов от посетителей sql.ru для их 24х7*0.99999. Даже если это не разовая операция, очевидно, что она не ежеминутная, и может быть выбрано на 0.99999 подходящее время между 24 и 7.

Суть моего поста была как раз в том, что вместо выяснения причины "завис", потянуло на эксперименты с неочевидными преимуществами, да еще которые не в состоянии реализовать. Вероятное место медленноты не сам апдейт, а получение исходных данных и джоин на обновляемую таблицу. Переписывание nested loop на for loop тут не помощник. Автор тщательно скрывает конкретности, заводя все новые темы и все дальше уходя от исходной задачи.
...
Рейтинг: 0 / 0
Вопрос по выполнению анонимного блока
    #39150116
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.,

я это скорее к тому, что не надо путать последовательное чтение (запись) и случайное. при обновлении части большой (не влезающей в память) таблицы небольшими батчами или в цикле как у тс будет скорее random io. а для слабой дисковой системы можно 100% disk util и на чтении 10МБ/с получить.

Бока,

какой процент от числа строк в таблице в итоге нужно обновить? зачем обновлять поле id (я так понимаю оно pk)? откуда берутся данные, на которые нужно заменять?
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вопрос по выполнению анонимного блока
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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