Quais são algumas práticas recomendadas para consultar dados binários de um banco de dados?

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Estou sendo solicitado para adicionar queryability a um banco de dados (Oracle) preenchido com dados principalmente binários. Então eu preciso ser capaz de consultar faixas binários dentro de bolhas de alguns kilobytes. Eu nunca fiz isso antes, então eu estou querendo saber quais são algumas boas práticas e armadilhas a considerar quando se inicia um projeto como este.

Graças

Foi útil?

Solução

Adicione uma coluna de MD5, que é a soma de verificação MD5 dos dados BLOB. Ou, você pode criar uma nova tabela com a mesma chave primária ea coluna MD5.

O seu módulo de cache fora do banco de dados pode fazer uso dessa coluna não ter que recuperar a coluna BLOB duas vezes em um cache-hit.

Ou, você poderia soltar os dados de BLOB no banco de dados e armazená-lo em um sistema de arquivos com o valor MD5 como um nome de arquivo com um servidor http como um servidor de arquivos de rede.

Outras dicas

Sem saber suas necessidades exatas, eu posso fazer apenas alguns comentários gerais.

BLOBS no Oracle não são os mais rápida de tipos. Certifique-se que você não construir a muitos gargalos de desempenho em seu projeto, e fazer testes de desempenho executados em a funcionalidade você construir o mais rápido possível para garantir que ele vai atender aos requisitos.

DBMS_LOB é seu amigo. Em particular, você pode encontrar a função de leitura e substr (para leitura de partes do blob) fora útil.

Fique longe de procedimentos estilo C externos - eles são susceptíveis de ser muito lento. funções PL / SQL tendem a ser muito mais rápido. Eu não sei sobre os procedimentos Java. Como o java motor está mais integrado no Oracle eles podem ser muito bom para usar. Pode valer a pena fazer uma prova de conceito para comparar PL / SQL contra Java.

Com Java, você vai ser capaz de ler os dados como um fluxo de byte [] e manipular -lo ao seu conteúdo corações usando o mundo f Java. procedimentos externos para Java são fáceis de fazer - você pode até mesmo dar a Oracle o código-fonte Java

.

Para PL / SQL, uma técnica que nós encontramos muito útil é converter o blob para uma matéria, elenco que a um VARCHAR, e, em seguida, convertê-lo em hexadecimal, em seguida, manipular o hexa (cordas) com funções padrão de cordas Oracle. Ou seja:

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;
/

Isto trabalharia para blobs até 15kb de tamanho. A função retrieve_embedded pode, por exemplo, ser capaz de ler o primeiro "byte", fazendo um substr(data, 1, 8), convertendo isso a um decimal via uso to_number(hexdata, 'xxxxxxxx')-lo como uma compensação ... etc.

parâmetros de armazenamento podem fazer muita diferença significativa quando se trata de tanto armazenar e recuperar relativamente pequenas BLOBs (

Talvez o maior efeito sobre o desempenho é habilitar ou desabilitar 'IN ROW' de armazenamento. - É definitivamente vale a pena experimentar com

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top