Quali sono alcune delle migliori pratiche per l'esecuzione di query di dati binari da un database?

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

  •  03-07-2019
  •  | 
  •  

Domanda

Mi viene chiesto di aggiungere queryability a un database (Oracle) riempito con prevalenza di dati binari.Quindi ho bisogno di essere in grado di eseguire query binario intervalli all'interno di un blob di pochi kilobyte.Non l'ho mai fatto prima, quindi mi chiedo che cosa sono alcune buone pratiche e problemi da prendere in considerazione quando si inizia un progetto come questo.

Grazie

È stato utile?

Soluzione

Aggiungere una colonna di MD5, che è il checksum MD5 dei dati BLOB.O, è possibile creare una nuova tabella con la stessa chiave primaria, e l'MD5 colonna.

Il modulo di cache al di fuori del database, è possibile fare uso di tale colonna non hanno per recuperare la colonna BLOB due volte in un cache hit.

O, si potrebbe cadere il BLOB di dati nel database e memorizzare in un file di sistema con il valore MD5 come un nome di file con un server http come un file server di rete.

Altri suggerimenti

Senza sapere esattamente le vostre esigenze, posso fare solo alcune osservazioni di carattere generale.

BLOB in oracle non sono il più veloce di tipi.Assicurarsi che non si può costruire a molti colli di bottiglia delle prestazioni nel vostro disegno, e fare eseguire i test sulle prestazioni di la funzionalità di cui si costruirà il più presto possibile per garantire che sarà soddisfare i requisiti.

dbms_lob è tuo amico.In particolare si possono trovare le leggi e la funzione substr (per la lettura di parti del blob) utili.

Stare lontano da esterno in stile C procedure - sono suscettibili di essere molto lento.PL/SQL funzioni tendono ad essere molto più veloce.Non so su Java procedure.Come il java il motore è più integrato all'interno di Oracle possono essere molto buona per l'uso.Potrebbe essere la pena di facendo una prima prova di concetto per confrontare PL/SQL Java.

Con Java, sarete in grado di leggere i dati in un byte [] flusso e manipolare nei vostri cuori contenuto utilizzando il mondo f Java.Procedure esterne per Java sono facili da fare - si può anche dare Oracle il codice sorgente Java.

PL/SQL, una tecnica che abbiamo trovato molto utile è quello di convertire il blob di raw, il cast che per un varchar, e poi convertire in esadecimale, quindi manipolare l'hex (stringhe) con Oracle standard funzioni di stringa.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;
/

Questo dovrebbe funzionare per blob fino a 15Kb dimensioni.Il retrieve_embedded funzione potrebbe, per esempio, essere in grado di leggere il primo "byte" facendo un substr(data, 1, 8), la conversione che per un decimale via to_number(hexdata, 'xxxxxxxx') usarlo come un offset...ecc.

Memorizzazione parametri possono fare una differenza significativa quando si tratta di archiviazione e recupero di relativamente piccole macchie (< DB_BLOCK_SIZE * 2 o più).In generale, si desidera ridurre al minimo riga di migrazione di riga e di concatenamento, così come ridurre al minimo spreco di spazio libero.

Forse il più grande effetto sulle prestazioni è l'abilitazione o la disabilitazione 'IN RIGA' archiviazione - e ' sicuramente la pena di sperimentare con.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top