|
|
|
хочу странного. пятничный псто про аггрегирование строк в LOOP
|
|||
|---|---|---|---|
|
#18+
А есть ли способ из plpgsql кода вызвать Код: sql 1. 2. 3. скажем в LOOP [и, вторую, -- после] . если да -- то как [,карл] ? а то в loop может быть весьма навороченная логика, с трудом превращающаяся в динамич. SQL -- а, как показывает тест, string_agg существенно выигрывает у Код: src 1. 2. 3. когда chunk небольшие, а результат под 3 ляма символов. запрос нынче праздный (удалось таки всю логику запихать в string_agg ) но на будущее. 1. и вообще -- не грозятся ли byRef когда нибудь в plpgsql изобразить и кто как выкручивается, если выкручивается. когда надо шить длинные строки[скрипты] из данных может быть в других pl ? 2.да, и правильно ли я понимаю, что concat("any") | concat_ws(text, "any"); не спасёт -- т.к. проблема в самой передаче "по значению", а от неё мы уйти не можем ? или неправильно ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2015, 17:13 |
|
||
|
хочу странного. пятничный псто про аггрегирование строк в LOOP
|
|||
|---|---|---|---|
|
#18+
qwwq, Если меня память не подводит проблема в том что var:=var||chunk; каждый раз делает новую строку и получается куча palloc/pfree очень дорогих. (тоже самое с созданием ARRAY путем последовательного добавления элементов). Я бы посоветовал просто навороченную логику в отдельную хранимку загнать а далее вызывать через select string_agg(...) into something from _sp(arguments). Скорее всего самый эффективный метод. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2015, 17:58 |
|
||
|
хочу странного. пятничный псто про аггрегирование строк в LOOP
|
|||
|---|---|---|---|
|
#18+
Maxim BogukЕсли меня память не подводит проблема в том что var:=var||chunk; каждый раз делает новую строку и получается куча palloc/pfree очень дорогих. (тоже самое с созданием ARRAY путем последовательного добавления элементов). В 9.5 Том поправил это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2015, 18:13 |
|
||
|
хочу странного. пятничный псто про аггрегирование строк в LOOP
|
|||
|---|---|---|---|
|
#18+
Maxim Bogukqwwq, Если меня память не подводит проблема в том что var:=var||chunk; каждый раз делает новую строку и получается куча palloc/pfree очень дорогих. (тоже самое с созданием ARRAY путем последовательного добавления элементов). Maxim BogukЯ бы посоветовал просто навороченную логику в отдельную хранимку загнать а далее вызывать через select string_agg(...) into something from _sp(arguments). Скорее всего самый эффективный метод. принимается. в эту сторону я не подумал. PS иллюстрация к исходной постановке Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2015, 18:26 |
|
||
|
хочу странного. пятничный псто про аггрегирование строк в LOOP
|
|||
|---|---|---|---|
|
#18+
qwwqMaxim Bogukqwwq, Если меня память не подводит проблема в том что var:=var||chunk; каждый раз делает новую строку и получается куча palloc/pfree очень дорогих. (тоже самое с созданием ARRAY путем последовательного добавления элементов). Maxim BogukЯ бы посоветовал просто навороченную логику в отдельную хранимку загнать а далее вызывать через select string_agg(...) into something from _sp(arguments). Скорее всего самый эффективный метод. принимается. в эту сторону я не подумал. PS иллюстрация к исходной постановке Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. -- "поправил" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2015, 18:28 |
|
||
|
хочу странного. пятничный псто про аггрегирование строк в LOOP
|
|||
|---|---|---|---|
|
#18+
Если проблема в перекопировании всего накапливаемого объема при каждой конкатенации - можно конкатенировать ограниченный объем и сохранять в массив, а потом конвертировать в результирующую строку. Кстати, обратить внимание на тип. Возможно plpgsql по разному управляет памятью для varchar(1000) и varchar(1e6) или text, а может быть и фиксированный char(...). Диагностировать проблему перекопирования можно заметив нелинейное увеличение времени с ростом результирующей строки. Затык может быть еще и в обычно употребляемой кодировке utf8. Варианты функций для работы с символами переменной длины значительно уступают фиксированным по скорости. И производительность некоторых падает с ростом строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2015, 18:45 |
|
||
|
хочу странного. пятничный псто про аггрегирование строк в LOOP
|
|||
|---|---|---|---|
|
#18+
p2.Если проблема в перекопировании всего накапливаемого объема при каждой конкатенации - можно конкатенировать ограниченный объем и сохранять в массив, а потом конвертировать в результирующую строку. массив конкатенируется так же. если не использовать array_agg, котрый работает аналогично string_agg -- вероятно копит array|строку по ссылке в "internal" и возвращает по последнему вызову финальной функции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2015, 19:05 |
|
||
|
хочу странного. пятничный псто про аггрегирование строк в LOOP
|
|||
|---|---|---|---|
|
#18+
qwwqмассив конкатенируется так жеимел ввиду array_to_string. глупо было бы внутри такой функции заниматься переливанием из пустополного в биткомпорожнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2015, 19:27 |
|
||
|
хочу странного. пятничный псто про аггрегирование строк в LOOP
|
|||
|---|---|---|---|
|
#18+
p2.qwwqмассив конкатенируется так жеимел ввиду array_to_string. глупо было бы внутри такой функции заниматься переливанием из пустополного в биткомпорожнее.и что ? массив то надо сконкатенировать. выигрыш тут в числах при N выделений памяти ~1..N затраты ~C0* n*N/2 если N ~ M*K то сшивка: оценкаC 0 *m*M/2 {строки длиной m} + C 0 *k*K/2{итого} + C 1 *k*N/2{сшивка массива, длиной k, строк длиной m/2} вот если бы хранить результат промежуточных сшивок без этих затрат (на конкатенацию массива C 1 ...) -- то можно бы попарно сливать на каждой итерации. (наверное через set returning можно. вроде бы сеты быстро размещаются). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2015, 10:05 |
|
||
|
|

start [/forum/topic.php?fid=53&fpage=108&tid=1997901]: |
0ms |
get settings: |
5ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
23ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
| others: | 207ms |
| total: | 323ms |

| 0 / 0 |
