Блобы Oracle - хранят размер или вычисляют?

Я пишу универсальную услугу хостинга ресурса Http и храню большие объекты как БЛОБЫ в базе данных Oracle. Я хочу смочь установить заголовок 'Довольной Длины' при возврате хранившего объекта, что означает, что я должен знать размер BLOB, прежде чем я начну писать это клиенту (я знаю, что мог использовать закодированный разделенный на блоки и в некоторых случаях). У кого-либо есть опыт с влиянием производительности, звоня dbms_lob.getlength (), будет иметь на каждом чтении, или я должен вычислить размер BLOB на ВСТАВКУ и сохранить его в таблице? В среднем я ожидал бы, что уровни записи будут выше затем уровни чтения. Я пишу сравнительный тест прямо сейчас, чтобы попытаться видеть, каково влияние, но на такой общий вопрос кажется, что я думал, что кто-то, возможно, уже понял это. Кроме того, с помощью JDBC/Spring 3, как я даже вычислил бы размер BLOB на запись? (и я не могу использовать триггеры или хранимые процедуры), Спасибо.

5
задан Gandalf 9 March 2010 в 16:59
поделиться

3 ответа

Я провел быструю проверку, выбрав BLOB из таблицы, а затем LENGTH (BLOB) и DBMS_LOB.GETLENGTH (BLOB). При выборе самого BLOB я получил 44 согласованных получения. Когда я выбрал длину (любым методом), я получил 7 последовательных приемов.

Исходя из этого, когда я получаю длину, он не извлекает весь blob и не вычисляет длину. Разумно предположить, что длина, которую он хранит в начале BLOB (например, хранится длина значения VARCHAR2), и используется напрямую.

Таким образом, не должно быть больших накладных расходов на определение длины, а не на ее сохранение. Это также снижает вероятность несоответствия.

6
ответ дан 14 December 2019 в 04:35
поделиться

Поскольку я еще не вижу ответов ..

Я не лично измерял что угодно, но наш администратор базы данных рекомендовал хранить их размер (я знаю, просто ОН мне так сказал). Тем не менее, он довольно хорош, поэтому я лично считаю, что сохранение размера - это лучший способ - по крайней мере, если это критично для производительности (нам пришлось бы вызвать .length () ОЧЕНЬ МНОГО).

0
ответ дан 14 December 2019 в 04:35
поделиться

Поскольку наши BLOB-объекты в целом хорошо сжимаются, мы использовали следующий подход: -

  • сохраняем сжатые BLOB-объекты. Сжатие выполняется на стороне Java, когда мы передаем поток в BLOB
  • , записываем несжатый размер в байтах в другой столбец той же таблицы
  • распаковываем через поток, когда мы снова отправляем BLOB, зная, какой размер содержимого будет

. Вы можете рассмотреть этот подход, если ваши большие двоичные объекты сжимаемы.

2
ответ дан 14 December 2019 в 04:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: