Quelles sont les meilleures pratiques pour interroger des données binaires à partir d'une base de données?

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

  •  03-07-2019
  •  | 
  •  

Question

On me demande d’ajouter une capacité de requête à une base de données (Oracle) contenant principalement des données binaires. Je dois donc pouvoir interroger des plages binaires dans des blobs de quelques kilo-octets. Je n’ai jamais fait cela auparavant, alors je me demande quelles sont les bonnes pratiques et les pièges à prendre en compte lors du démarrage d’un tel projet.

Merci

Était-ce utile?

La solution

Ajoutez une colonne de MD5, qui correspond au total de contrôle MD5 des données BLOB. Vous pouvez également 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 à extraire la colonne BLOB deux fois dans un cache-hit.

OU, vous pouvez supprimer les données BLOB de la base de données et les stocker dans un système de fichiers avec la valeur MD5 en tant que nom de fichier avec un serveur http en tant que serveur de fichiers réseau.

Autres conseils

Sans connaître exactement vos exigences, je ne peux faire que quelques commentaires généraux.

Les BLOBs dans Oracle ne sont pas les types les plus rapides. Assurez-vous de ne pas construire pour nombreux goulots d’étranglement dans votre conception et effectuez des tests de performance sur la fonctionnalité que vous construisez dès que possible pour vous assurer qu'elle répond aux exigences.

dbms_lob est votre ami. En particulier, vous pouvez trouver utiles les fonctions read et substr (pour lire des parties du blob) utiles.

Éloignez-vous des procédures de style C externes - elles risquent de ralentir considérablement. Les fonctions PL / SQL ont tendance à être beaucoup plus rapides. Je ne connais pas les procédures Java. Comme le java moteur est plus intégré dans Oracle, ils peuvent être très bons à utiliser. Cela peut valoir la peine faire une première preuve de concept pour comparer PL / SQL à Java.

Avec Java, vous pourrez lire les données sous forme de flux d'octets [] et les manipuler. contentez-vous d'utiliser le monde de 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ée très utile consiste à convertir le blob en un fichier brute converti en: un varchar, puis convertit cela en hexagone, puis manipule l'hexagone (chaînes) avec des fonctions de chaîne Oracle standard. 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 maximale de 15 Ko. La fonction retrieve_embedded peut, par exemple, être capable de lire le premier & "; Octet &"; en effectuant une substr(data, 1, 8) conversion en décimale via to_number(hexdata, 'xxxxxxxx') utilisez-la en tant que décalage ... etc.

Les paramètres de stockage peuvent faire une différence significative lorsqu'il s'agit de stocker et de récupérer des BLOB relativement petits (< DB_BLOCK_SIZE * 2 ou plus). En général, vous souhaitez minimiser la migration et le chaînage de lignes, ainsi que les espaces libres inutilisés.

L’effet le plus important sur les performances est peut-être d’activer ou de désactiver le stockage 'IN ROW' - cela vaut vraiment la peine d’essayer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top