|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
В процедуру загружаю (через BLOB) достаточно большой текст (XML). в процедуре произвожу "резку" текста по тегам, с последующей вставкой фрагментов в таблицу. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
столкнулся с тем, что небольшие файлы (1-2 мб, 1000 - 1500 блоков) обрабатываются достаточно быстро 2-3 секунды, однако при размере файлов в 35 мб 19200 блоков процедура просаживается в производительности без вставки, а только на цикл WHILE ... затрачивается более 40 минут. FB 2.59, WIN 2003, сервер виртуальный, 4 ядра XEON 2.4 , памяти 8GB, подключение только моё ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 09:40 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
zeon11, временные блобы перестают помещаться в страничном кеше и начинают сбрасываться на диск ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 09:50 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
zeon11, В чём смысл делать всё это именно на стороне FB? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 09:52 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис zeon11, временные блобы перестают помещаться в страничном кеше и начинают сбрасываться на диск Ок, понятно. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 09:54 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
crutchmaster zeon11, В чём смысл делать всё это именно на стороне FB? Если это можно делать на сервере, зачем это делать ещё где-то? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 09:57 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис zeon11, временные блобы перестают помещаться в страничном кеше и начинают сбрасываться на диск Если так, то попробовать увеличить кеш, пока writes не придут в норму. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 10:05 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
zeon11, потому что на клиенте будет быстрее, распарсить XML, подготовить запрос и сделать инсерт получившихся кусков ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 10:09 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис zeon11, потому что на клиенте будет быстрее, распарсить XML, подготовить запрос и сделать инсерт получившихся кусков Да, наверное, придётся так и делать. Раньше с малыми файлами разбирал XML исключительно на сервере. XML разбирался на полтора десятка таблиц, и разбирать на сервере было удобно, всё под рукой, но сейчас появились файлы до 90 мб, и всё резко просело по скорости. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 10:23 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
hvlad Это легко проверить - смотреть на рантайм статистику выполнения запроса (writes). Если так, то попробовать увеличить кеш, пока writes не придут в норму. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 10:29 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис потому что на клиенте будет быстрее, распарсить XML, подготовить запрос и сделать инсерт получившихся кусков Да, и нагрузка уйдёт туда же. У сервера ресурсы не резиновые. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 10:56 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
А через udf не вариант? Либо отдельной службой ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 15:30 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Василий 2А через udf не вариант? нет конечно. UDF умеет возвращать только скалярный результат, т.е. набор данных из неё не вернуть. Выполнять запросы в контексте текущего коннекта и транзакции там тоже нельзя. В UDR (внешние ХП) можно и то и другое, но это в 3.0 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 15:36 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
crutchmaster Симонов Денис потому что на клиенте будет быстрее, распарсить XML, подготовить запрос и сделать инсерт получившихся кусков Да, и нагрузка уйдёт туда же. У сервера ресурсы не резиновые. Сервер на то и есть, чтобы нагрузку держать, тем более, такая работа планируется на ночь, когда он (сервер) пальцем в носу ковыряет. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 18:29 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Василий 2 А через udf не вариант? Либо отдельной службой Симонов Денис Василий 2А через udf не вариант? нет конечно. UDF умеет возвращать только скалярный результат, т.е. набор данных из неё не вернуть. Выполнять запросы в контексте текущего коннекта и транзакции там тоже нельзя. В UDR (внешние ХП) можно и то и другое, но это в 3.0 UDF тут тоже работает, через UDF'ку разбираю элементарные блоки по значениям и разгоняю их по таблицам. В UDF'ку для ускорения загоняю сразу список значений, что мне надо получить, соответственно из UDF'ки единоразово получаю список результатов. Так что какой-то эрзац-набор данных в процедуре, всё-таки получаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 18:55 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
zeon11, по идее, из-за офигенного количества временных блобов будет пухнуть база (потом пустое место будет переиспользоваться). http://www.ibase.ru/dbgrowth/ а значит, чем быстрее диск, тем будет быстрее обработка. Обычно на виртуалках проблемы в основном с производительностю диска, кстати. На скорости проца и памяти падает, якобы, не более 5%. А вот на диске может быть много хуже. Я бы проверил диск crystaldiskmark. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 19:02 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
kdv zeon11, по идее, из-за офигенного количества временных блобов будет пухнуть база (потом пустое место будет переиспользоваться). http://www.ibase.ru/dbgrowth/ а значит, чем быстрее диск, тем будет быстрее обработка. Обычно на виртуалках проблемы в основном с производительностю диска, кстати. На скорости проца и памяти падает, якобы, не более 5%. А вот на диске может быть много хуже. Я бы проверил диск crystaldiskmark. Да, статью эту читал, да и постоянно Ваш сайт пересматриваю. Спасибо за ресурс. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 19:14 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис нет конечно. UDF умеет возвращать только скалярный результат, т.е. набор данных из неё не вернуть. Выполнять запросы в контексте текущего коннекта и транзакции там тоже нельзя. В UDR (внешние ХП) можно и то и другое, но это в 3.0 Так и не обязательно, можно и имеющимися средствами извратиться. Например, в цикле вызывать UDF с блобом и позицией, с которой начинать поиск. Пока не вернет пустую строку - повторять в цикле. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 19:35 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Василий 2 Симонов Денис нет конечно. UDF умеет возвращать только скалярный результат, т.е. набор данных из неё не вернуть. Выполнять запросы в контексте текущего коннекта и транзакции там тоже нельзя. В UDR (внешние ХП) можно и то и другое, но это в 3.0 Так и не обязательно, можно и имеющимися средствами извратиться. Например, в цикле вызывать UDF с блобом и позицией, с которой начинать поиск. Пока не вернет пустую строку - повторять в цикле. Тогда в UDF надо держать открытым объект, в данном случае TXMLDocument, и гонять его хендл из UDF в процедуру и обратно, и это будет работать скорее всего только на Classic. А может так вообще делать нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 21:09 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
zeon11 Тогда в UDF надо держать открытым объект, в данном случае TXMLDocument, и гонять его хендл из UDF в процедуру и обратно, и это будет работать скорее всего только на Classic. А может так вообще делать нельзя. Да не, я имел в виду, чтобы udf делала только то, что сейчас делает процедура - извлекала куски из блоба в виде строки varchar. Кстати, насчет размножения временных блобов неплохо бы в доки. А то только в тут https://www.ibase.ru/dbgrowth/ нашел, и то когда давал запрос целенаправленно. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2020, 10:34 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Василий 2, даже если написать свою версию UDF SUBSTRING которая возвращает VARCHAR(8191), то этот блоб придётся многократно открыть, прочитать и закрыть. Причём если блоб не поточный, то для поиска нужной позиции придётся каждый раз читать его с самого начала. Но это хотя бы уберёт временные блобы. О производительности разных решений. Недавно баловался с написанием внешних процедур на С++ (в качестве самообучения). Написал собственную процедуру split_int для разделения больших BLOB. Суть теста генерируем числа от 1 до 1000000 и соединяем их агрегатной функцией LIST скрипт Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Код: plaintext 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.
В результате получается блоб размером ~6 Мбайт. Теперь собственно разделение тест split_int Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Код: plaintext 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.
1.992 - 0.625 = 1.367 c Т.е. процедура разбила по разделителю 6 мегабайтный блоб за 1.4 секунды. Сильно сомневаюсь что вы сможете получить подобный результат с помощью UDF или PSQL ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2020, 11:03 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис, Если не сложно, можешь запустить на этой же конфигурации разделение процедурой 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. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2020, 11:40 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
WildSery, вечером попробую. Я этот тест на домашней машине делал ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2020, 11:41 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис, Если всё с собой - можно на любой повторить :) Главное ведь, чтобы на одной и той же. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2020, 11:46 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
WildSery, нет у меня на работе UDR той. Я же её писал для развлечения (самообучения), а не для продакшена. Вот на другой машине Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
у меня дома конечно комп чуть по мощней, но не настолько же ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2020, 12:14 |
|
|
start [/forum/topic.php?fid=40&msg=39922681&tid=1560441]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
126ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 262ms |
total: | 478ms |
0 / 0 |