Каковы некоторые рекомендации для запроса двоичных данных из базы данных? - PullRequest
2 голосов
/ 17 октября 2008

Меня просят добавить возможность запроса в базу данных (Oracle), заполненную в основном двоичными данными. Поэтому мне нужно иметь возможность запрашивать двоичные диапазоны в пределах нескольких килобайт. Я никогда не делал этого раньше, поэтому мне интересно, какие хорошие практики и подводные камни следует учитывать при запуске такого проекта.

Спасибо

Ответы [ 3 ]

3 голосов
/ 18 октября 2008

Добавьте столбец MD5, который является контрольной суммой MD5 данных BLOB. Или вы можете создать новую таблицу с тем же первичным ключом и столбцом MD5.

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

ИЛИ, вы можете удалить данные BLOB в базе данных и сохранить их в файловой системе со значением MD5 в качестве имени файла с сервером http в качестве сетевого файлового сервера.

2 голосов
/ 17 октября 2008

Не зная ваших точных требований, я могу высказать лишь некоторые общие замечания.

BLOBS в оракуле - не самый быстрый тип. Убедитесь, что вы не строите в многие узкие места производительности в вашем дизайне, и запустить тесты производительности на функциональность, которую вы создаете, как можно скорее, чтобы обеспечить ее соответствие требованиям.

dbms_lob - ваш друг. В частности, вам может пригодиться функция read и substr (для чтения частей большого двоичного объекта).

Держитесь подальше от внешних процедур в стиле C - они, вероятно, будут слишком медленными. Функции PL / SQL имеют тенденцию быть намного быстрее. Я не знаю о процедурах Java. Как ява Движок более интегрирован в Oracle, они могут быть очень хороши в использовании. Это может стоить делает первоначальное подтверждение концепции для сравнения PL / SQL с Java.

С Java вы сможете читать данные в виде потока байтов [] и манипулировать ими. это к вашему сердцу содержание с использованием мира Java. Внешние процедуры для Java легко выполнить - вы можете просто дать Oracle исходный код Java.

Для PL / SQL один метод, который мы нашли очень полезным, - это преобразование большого двоичного объекта в сырой, приведение к varchar, а затем преобразовать его в гекс, затем манипулируя гекс (строки) со стандартными строковыми функциями Oracle. То есть:

create or replace function retrieve_data_from_blob (
    b blob
    , tag_code
)
as
    lw long raw;
    data varchar(30000);
    result varchar(100);
    amount pls_integer := 30000;
begin
    -- covert blob to long raw.
    -- amount will hold total bytes read.
    dbms_lob.read(b, amount, 1, lw);
    data := util_raw.rawtohex(lw);
    -- retrieve_embedded retrieves data tagged with tag_code
    -- from internal binary structure by reading hex data
    return retrieve_embedded(data, tag_code);
end;
/

Это будет работать для больших двоичных объектов размером до 15 КБ. Функция retrieve_embedded, например, может быть в состоянии прочитать первый «байт», выполнив substr(data, 1, 8), преобразовав его в десятичное число с помощью to_number(hexdata, 'xxxxxxxx'), используя его как смещение ... и т. Д.

1 голос
/ 18 октября 2008

Параметры хранения могут иметь весьма существенное значение, когда речь идет как о сохранении, так и получении относительно небольших BLOB-объектов (

Возможно, наибольшее влияние на производительность оказывает включение или отключение хранилища IN ROW - с ним определенно стоит поэкспериментировать.

...