2008-10-17 4 views
2

On me demande d'ajouter une interrogation à une base de données (Oracle) remplie de données principalement binaires. Je dois donc pouvoir interroger des plages binaires dans un blob de quelques kilo-octets. Je n'ai jamais fait cela auparavant, donc je me demande quelles sont les bonnes pratiques et les pièges à prendre en compte lors du démarrage d'un projet comme celui-ci.Quelles sont les meilleures pratiques pour interroger des données binaires à partir d'une base de données?

Merci

Répondre

3

Ajoutez une colonne de MD5, qui est la somme de contrôle MD5 des données BLOB. Ou, vous pouvez créer une nouvelle table avec la même clé primaire et la colonne MD5.

Votre module de cache en dehors de la base de données peut utiliser cette colonne pour ne pas avoir à récupérer la colonne BLOB deux fois dans un cache-hit. OU vous pouvez supprimer les données BLOB dans la base de données et les stocker dans un système de fichiers avec la valeur MD5 comme nom de fichier avec un serveur http comme serveur de fichiers réseau.

2

Sans connaître vos besoins exacts, je ne peux faire que des commentaires généraux. Les BLOBS dans Oracle ne sont pas les types les plus rapides. Assurez-vous de ne pas générer de nombreux goulots d'étranglement au niveau de la performance et exécutez des tests de performance sur la fonctionnalité que vous construisez le plus rapidement possible pour vous assurer qu'elle répondra aux exigences.

dbms_lob est votre ami. En particulier, vous pouvez trouver utile la fonction read et substr (pour lire des parties du blob). Restez à l'écart des procédures de type C externes - elles sont susceptibles de ralentir considérablement. Les fonctions PL/SQL ont tendance à être beaucoup plus rapides. Je ne connais pas les procédures Java. Comme le moteur Java est plus intégré dans Oracle, il peut être très bon à utiliser. Il peut être utile de faire une première validation de principe pour comparer PL/SQL avec Java. Avec Java, vous pourrez lire les données sous la forme d'un octet [] et manipuler à votre guise en utilisant le monde Java. Les procédures externes pour Java sont faciles à faire - vous pouvez même simplement donner à Oracle le code source Java.

Pour PL/SQL, une technique que nous avons trouvé très utile est de convertir le blob à une brute, qui jeta à un varchar, puis le convertir en hexadécimal, puis manipuler l'hexagone (cordes) à la norme Fonctions de chaîne Oracle. I.e:

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

Cela fonctionnerait pour des blobs d'une taille allant jusqu'à 15Kb. La fonction retrieve_embedded peut, par exemple, être capable de lire le premier « octet » en faisant une substr(data, 1, 8), la conversion à une décimale que par to_number(hexdata, 'xxxxxxxx') l'utiliser comme un offset ... etc.

1

paramètres de stockage peuvent faire tout à fait significatif différence quand il s'agit à la fois de stocker et de récupérer des BLOB relativement petits (< DB_BLOCK_SIZE * 2 ou plus). En général, vous souhaitez réduire la migration des lignes et le chaînage des lignes, ainsi que minimiser l'espace libre gaspillé. Le meilleur effet sur la performance est peut-être d'activer ou de désactiver le stockage «IN ROW» - cela vaut vraiment la peine d'expérimenter.

Questions connexes