Wat is 'n paar beste praktyke vir die gebruik daarvan binêre data van 'n databasis?

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

  •  03-07-2019
  •  | 
  •  

Vra

Ek word gevra om queryability voeg tot 'n databasis (Oracle) gevul met meestal binêre data. So ek moet in staat wees om binêre reekse navraag binne 'n blobs van 'n paar kilogrepe. Ek het dit nooit gedoen voor, so ek wonder wat is 'n paar goeie praktyke en slaggate om te oorweeg wanneer 'n projek soos hierdie.

Dankie

Was dit nuttig?

Oplossing

Voeg 'n kolom van MD5, wat is die MD5 checksum van die BLOB data. Of jy kan 'n nuwe tabel te skep met dieselfde primêre sleutel en die kolom MD5.

Jou kas module buite die databasis kan gebruik maak van die kolom te hê om die BLOB kolom twee keer te haal in 'n kas-treffer.

Of, kan jy die BLOB data val in die databasis en stoor dit in 'n lêer stelsel met die MD5 waarde as 'n lêernaam met 'n http bediener as 'n netwerk lêerbediener.

Ander wenke

Sonder om te weet jou presiese vereistes, kan ek net 'n paar algemene opmerkings maak.

druppels in die binneste van is nie die mees spoedige van tipes. Maak seker dat jy nie te bou aan baie prestasie knelpunte in jou ontwerp, en moenie hardloop prestasie toetse op die funksies wat jy hoef te bou so gou as moontlik om te verseker dat dit sal voldoen.

dbms_lob is jou vriend. In die besonder, kan jy die lees en substr funksie vind (vir lees dele van die blob) uit nuttig.

Bly weg van eksterne C styl prosedures - hulle is geneig om baie te stadig te wees. PL / SQL funksies is geneig om baie vinniger wees. Ek weet nie van Java prosedures. As die java enjin is meer geïntegreerde in Oracle hulle kan baie goed wees om te gebruik. Dit kan die moeite werd wees doen 'n aanvanklike bewys van die konsep om PL / SQL vergelyk teen Java.

Met Java, sal jy in staat wees om die data te lees in 'n byte [] stroom en manipuleer dit aan jou hart inhoud met behulp van die wêreld f Java. Eksterne prosedures vir Java is maklik om te doen - jy kan selfs net gee Oracle die Java bronkode

.

Vir PL / SQL, een tegniek wat ons het gevind baie nuttig is om die blob om te skakel na 'n rou, gooi dit na 'n varchar, en dan sit dit aan hex, dan manipuleer die blok (snare) met standaard Oracle string funksies. D.w.z:

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

Dit sal werk vir druppels tot 15kb in grootte. Die retrieve_embedded funksie kan, byvoorbeeld, in staat wees om die eerste "byte" lees deur 'n substr(data, 1, 8), omskakeling wat 'n desimale via to_number(hexdata, 'xxxxxxxx') gebruik dit as 'n offset ... ens.

Storage parameters kan nogal 'n beduidende verskil maak wanneer dit kom by beide bewaar en te herwin relatief klein BLOB (

Miskien is die grootste invloed op die prestasie aktiveer of deaktivering 'in ry' stoor -. Dit is beslis die moeite werd om te eksperimenteer met

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top