У меня возникла проблема с производительностью при удалении больших двоичных объектов в дерби, и мне было интересно, кто-нибудь может предложить какой-либо совет.
Это в первую очередь с 10.4.2.0 под windows и solaris, хотя я также тестировал с новым кандидатом на выпуск 10.5.1.1 (так как в нем много изменений lob), но это не имеет существенного различия.
Проблема в том, что в случае таблицы, содержащей много больших BLOB-объектов, удаление одной строки может занять много времени (часто более минуты).
Я воспроизвел это с помощью небольшого теста, который создает таблицу, вставляет несколько строк с каплями разного размера, а затем удаляет их.
Схема таблицы проста, просто:
создание таблицы blobtest (целочисленное значение id, сгенерированное DEFAULT как идентификатор, b blob)
и я создал 7 строк со следующими размерами BLOB-объектов: 1024 байта, 1 МБ, 10 МБ, 25 МБ, 50 МБ, 75 МБ, 100 МБ.
Я прочитал большие двоичные объекты, чтобы убедиться, что они были созданы правильно и имеют правильный размер.
Затем они были удалены с помощью оператора sql («удалить из blobtest, где id = X»).
Если я удаляю строки в том порядке, в котором я их создал, средние сроки удаления одной строки:
1024 байта: 19,5 секунд
1Mb: 16 секунд
10 МБ: 18 секунд
25 МБ: 15 секунд
50 МБ: 17 секунд
75Mb: 10 секунд
100 МБ: 1,5 секунды
Если я удаляю их в обратном порядке, средние сроки удаления одной строки:
100 МБ: 20 секунд
75 МБ: 10 секунд
50 МБ: 4 секунды
25Mb: 0,3 секунды
10 МБ: 0,25 секунды
1Mb: 0,02 секунды
1024 байта: 0,005 секунды
Если я создаю семь маленьких капель, время удаления будет мгновенным.
Таким образом, похоже, что время удаления связано с общим размером строк в таблице больше, чем размер удаляемого большого двоичного объекта.
Я запускал тесты несколько раз, и результаты кажутся воспроизводимыми.
Итак, есть ли у кого-нибудь объяснение производительности и какие-либо предложения о том, как обойти это или исправить? Это делает использование больших капель довольно проблематичным в производственной среде…