Каковы наилучшие методы запроса двоичных данных из базы данных?

StackOverflow https://stackoverflow.com/questions/210882

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Спасибо

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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 КБ.Например, функция return_embedded может прочитать первый «байт», выполнив substr(data, 1, 8), преобразуя это в десятичное число с помощью to_number(hexdata, 'xxxxxxxx') используйте это как компенсацию...и т. д.

Параметры хранения могут иметь весьма существенное значение, когда речь идет как о хранении, так и о получении относительно небольших BLOB-объектов (< DB_BLOCK_SIZE * 2 или около того).В общем, вы хотите свести к минимуму миграцию строк и цепочку строк, а также свести к минимуму потерю свободного пространства.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top