¿Cuáles son algunas de las mejores prácticas para consultar datos binarios de una base de datos?

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Se me pide que agregue consultabilidad a una base de datos (Oracle) llena principalmente de datos binarios. Por lo tanto, necesito poder consultar rangos binarios dentro de unos blobs de unos pocos kilobytes. Nunca he hecho esto antes, así que me pregunto cuáles son algunas buenas prácticas y dificultades a tener en cuenta al comenzar un proyecto como este.

Gracias

¿Fue útil?

Solución

Agregue una columna de MD5, que es la suma de comprobación MD5 de los datos BLOB. O bien, puede crear una nueva tabla con la misma clave principal y la columna MD5.

Su módulo de caché fuera de la base de datos puede hacer uso de esa columna para no tener que recuperar la columna BLOB dos veces en un golpe de caché.

O, puede colocar los datos BLOB en la base de datos y almacenarlos en un sistema de archivos con el valor MD5 como nombre de archivo con un servidor http como servidor de archivos de red.

Otros consejos

Sin conocer sus requisitos exactos, solo puedo hacer algunos comentarios generales.

BLOBS en Oracle no son los tipos más rápidos. Asegúrese de no construir para muchos cuellos de botella de rendimiento en su diseño, y ejecute pruebas de rendimiento en la funcionalidad que construyes lo antes posible para asegurarte de que cumpla con los requisitos.

dbms_lob es tu amigo. En particular, puede encontrar útil la función de lectura y substr (para leer partes del blob).

Manténgase alejado de los procedimientos externos de estilo C: es probable que sean muy lentos. Las funciones PL / SQL tienden a ser mucho más rápidas. No sé sobre los procedimientos de Java. Como el java El motor está más integrado en Oracle, pueden ser muy buenos para usar. Puede valer la pena haciendo una prueba de concepto inicial para comparar PL / SQL con Java.

Con Java, podrá leer los datos como un flujo de bytes [] y manipularlos a tu gusto contento usando el mundo f Java. Los procedimientos externos para Java son fáciles de hacer: incluso puede darle a Oracle el código fuente de Java.

Para PL / SQL, una técnica que hemos encontrado muy útil es convertir el blob en bruto, convertirlo en un varchar, y luego convertirlo a hexadecimal, luego manipulando el hex (cadenas) con funciones estándar de cadena de Oracle. Es decir:

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

Esto funcionaría para blobs de hasta 15Kb de tamaño. La función retrieve_embedded puede, por ejemplo, poder leer el primer & Quot; byte & Quot; haciendo un substr(data, 1, 8), convirtiéndolo a un decimal a través de to_number(hexdata, 'xxxxxxxx') úsalo como un desplazamiento ... etc.

Los parámetros de almacenamiento pueden hacer una diferencia bastante significativa cuando se trata de almacenar y recuperar BLOB relativamente pequeños (< DB_BLOCK_SIZE * 2 más o menos). En general, desea minimizar la migración de filas y el encadenamiento de filas, así como minimizar el espacio libre desperdiciado.

Quizás el mayor efecto en el rendimiento es habilitar o deshabilitar el almacenamiento 'IN ROW'; definitivamente vale la pena experimentar con él.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top