|
|
|
Вопрос по выполнению анонимного блока
|
|||
|---|---|---|---|
|
#18+
Если вне функции определен type Код: plaintext 1. автор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 сконкатенированных апдейтов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2016, 12:51 |
|
||
|
Вопрос по выполнению анонимного блока
|
|||
|---|---|---|---|
|
#18+
Бока, эко хитрО заходите. блок do всегда был "void returning функцией БЕЗ параметров" (чего иногда моловато) м.б. сейчас что--то меняется, если да -- то ткните в ссыль. но заявка (запихать DO в PREPARE [, а тем паче пропихнуть параметр sql.EXECUTE--контекста неявно в DO]) интересная. думаю, работать не будет, до тех пор , пока вместо do вы не напишете CREATE OR REPLACE function my_do(my_params). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2016, 15:18 |
|
||
|
Вопрос по выполнению анонимного блока
|
|||
|---|---|---|---|
|
#18+
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. не предвидится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2016, 15:28 |
|
||
|
Вопрос по выполнению анонимного блока
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2016, 15:29 |
|
||
|
Вопрос по выполнению анонимного блока
|
|||
|---|---|---|---|
|
#18+
БокаЕсли вне функции определен type Код: plaintext 1. автор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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2016, 19:40 |
|
||
|
Вопрос по выполнению анонимного блока
|
|||
|---|---|---|---|
|
#18+
qwwq, Я еще забыл обрамить сконкатенированный набор update-ов операторными скобками Код: plaintext Код: plaintext Выполнится ли вот такая конструкция: 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? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2016, 20:14 |
|
||
|
Вопрос по выполнению анонимного блока
|
|||
|---|---|---|---|
|
#18+
Бока, вы читаете, что вам отвечают ? выше приведён ИСЧЕРПЫВАЮЩИЙ, ять, список допустимых инструкций PREPARED--statement-а. (там выпал WITH как [многочленистый] частный случай, который шире своего последнего стейтмента -- вот он ещё м.б.). всё остальное попросту не пролезет через синтакс парсер Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. не надо придумывать то, чего нет. ваш удел -- пользователь предоставленных интерфейсов [синтакса] (хотя от разрабов хотелось бы и приятных неожиданностей) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2016, 20:54 |
|
||
|
Вопрос по выполнению анонимного блока
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, цель заменить значения клюей в таблице согласно парам (старое значение - новое значение в двумерном массиве. Я предполагаю, что бэтч будет работать быстрее, поэтому: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. будет ли это внутри функции работать ? Или же делать отдельно каждый update в каждой итерации цикла Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ?? Можете подсказать что-нибудь в этом контексте? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 08:37 |
|
||
|
Вопрос по выполнению анонимного блока
|
|||
|---|---|---|---|
|
#18+
Бока, 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 08:54 |
|
||
|
Вопрос по выполнению анонимного блока
|
|||
|---|---|---|---|
|
#18+
БокаЯ предполагаю, что бэтч будет работать быстреебыстрее работает обычно то, что проще, то есть один апдейт без plpgsql и вывертов с промежуточными коммитами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 09:11 |
|
||
|
Вопрос по выполнению анонимного блока
|
|||
|---|---|---|---|
|
#18+
p2.БокаЯ предполагаю, что бэтч будет работать быстреебыстрее работает обычно то, что проще, то есть один апдейт без plpgsql и вывертов с промежуточными коммитами.есть разные "обычно" обычно сильно используемая таблица не любит апдейтов 10^6--10^8 записей за раз -- т.к. за ним, апдейтом на часы (а если там, не дай, ещё и триггера пишут в исчисляемые, да по гирлянде -- то и сутки) , почему-то пользователи в очередь утыкаются. в очередь на разделяемый ресурс. Поэтому задачу "отапдейтить немеряно строк" выполняют коротенькими автономиями. иногда даже сам цыкл запуская в другой БД (или вообще снаружи -- в клиенте каком--то). А чтобы при крахах стартовать только по хвосту -- ещё и продумывают протоколирование достигнутого (если оно там в атвомате не получается). ТС просто никогда этого не делал -- вот и мается неделю. там один раз написать -- и больше думать не надо -- просто в рефлексы перевести. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 10:37 |
|
||
|
Вопрос по выполнению анонимного блока
|
|||
|---|---|---|---|
|
#18+
p2., Весь процесс - это обрвботка группы таблиц с десТками миллионов записей в каждой. Один апдейт я уже делао, он завис ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 11:44 |
|
||
|
Вопрос по выполнению анонимного блока
|
|||
|---|---|---|---|
|
#18+
qwwq, Хорошо попробую автономку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 11:48 |
|
||
|
Вопрос по выполнению анонимного блока
|
|||
|---|---|---|---|
|
#18+
qwwq, Я действительно раньше с особо большими твблмцами не работал, но маючь не неделю - эта рвбрта у меня по совместиткльству , вчера на форум захоодил с телефона , нахрлясь на другой работе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 11:54 |
|
||
|
Вопрос по выполнению анонимного блока
|
|||
|---|---|---|---|
|
#18+
qwwq, А в автономке как лучше: - апдайт одной записи в уаждой итеоации цикла ? - апдэйт бэтчем "begin; ... end;" ? - или один апдэйт на всю таблицу ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 12:01 |
|
||
|
Вопрос по выполнению анонимного блока
|
|||
|---|---|---|---|
|
#18+
Бока, 3. зачем вам автономка на один большой апдейт всей таблицы ? 2. если вы в своём коде напишете Код: sql 1. 2. -- у вас автоматом получится автономка размером с длину my_array_id_part 1. то же , но без собирания в [частичные] массивы. по самим вопросам -- it depends. есть обычно некий размер оптимальной порции, когда вы не тратитесь на излишне частые транзакции - с одной, на излишне большие (с очередями других пользователей) -- с другой. позаписно легче в коде. на пару строчек и немного мысли. батчами -- настраиваемее. у вас какие-то проблемы с макетированием задумок. это все моментально собирается на коленке на тестовом. и тестируется "что лучше" в вашем случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 12:12 |
|
||
|
Вопрос по выполнению анонимного блока
|
|||
|---|---|---|---|
|
#18+
БокаОдин апдейт я уже делао, он зависОбновить 10млн строк при скромной скорости записи 10МБ/сек займет секунд, сколько средний размер строки в байтах. Строка 300 байт, значит 5 минут. Построчный проход в цикле увеличит время в несколько раз. Поштучный доступ к элементам десятимиллионного массива - умножить еще на цать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 12:26 |
|
||
|
Вопрос по выполнению анонимного блока
|
|||
|---|---|---|---|
|
#18+
p2.БокаОдин апдейт я уже делао, он зависОбновить 10млн строк при скромной скорости записи 10МБ/сек займет секунд, сколько средний размер строки в байтах. Строка 300 байт, значит 5 минут. Построчный проход в цикле увеличит время в несколько раз. Поштучный доступ к элементам десятимиллионного массива - умножить еще на цать. рассуждения если и годные -- то для insert. после update одним куском у меня будет таки 2 изменённых кучи -- одна -- дедровсов -- с измененным xmax вторая -- новых записей . а сколько ещё локов придётся поставить ? не говоря о том, что при наличии дополнительно ON EACH ROW логики мы сразу опускаемся на землю -- там эта логика может жрать много больше, чем наши прикидки. процесс сразу становится буквально по-записным, и без нашего участия. и всё это время конкуренты сосут лапу в очереди. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 14:21 |
|
||
|
Вопрос по выполнению анонимного блока
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. -- т.е k>2 (к прямым "прикидкам") уже в простейшем случае. без явной on each row логики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 14:27 |
|
||
|
Вопрос по выполнению анонимного блока
|
|||
|---|---|---|---|
|
#18+
p2.БокаОдин апдейт я уже делао, он зависОбновить 10млн строк при скромной скорости записи 10МБ/сек займет секунд, сколько средний размер строки в байтах. Строка 300 байт, значит 5 минут. Построчный проход в цикле увеличит время в несколько раз. Поштучный доступ к элементам десятимиллионного массива - умножить еще на цать. в общем случае некорректная оценка, когда таблицы и индексы в память не помещаются. помимо записи в wal'ы (и записи будет больше) нужно строки сначала прочитать, а это сначала random io в индекс, потом в таблицу. причем читаем за раз не одну строку, а страницу 8кб, и нужные строки могут быть по всей таблице разбросаны. если размер таблицы >> размера памяти, диски не ssd и есть еще нагрузка, то обновлять 10М строк можно вечность. Бока, не совсем понятно, зачем так усложнять. создаем таблицу с 10М строк, дальше пишем цикл на любом языке и обновляем нужную таблицу батчами по 100-10000 строк. обновлять можно прям одним запросом с cte, который выберет из таблицы x строк, удалит их, и сделает на основе них update. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 14:36 |
|
||
|
Вопрос по выполнению анонимного блока
|
|||
|---|---|---|---|
|
#18+
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 тут не помощник. Автор тщательно скрывает конкретности, заводя все новые темы и все дальше уходя от исходной задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 16:28 |
|
||
|
Вопрос по выполнению анонимного блока
|
|||
|---|---|---|---|
|
#18+
p2., я это скорее к тому, что не надо путать последовательное чтение (запись) и случайное. при обновлении части большой (не влезающей в память) таблицы небольшими батчами или в цикле как у тс будет скорее random io. а для слабой дисковой системы можно 100% disk util и на чтении 10МБ/с получить. Бока, какой процент от числа строк в таблице в итоге нужно обновить? зачем обновлять поле id (я так понимаю оно pk)? откуда берутся данные, на которые нужно заменять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 20:52 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39149498&tid=1997509]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
199ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 234ms |
| total: | 523ms |

| 0 / 0 |
