2010-03-09 14 views
5

Sto scrivendo un servizio di hosting di risorse Http generico e sto memorizzando oggetti più grandi come BLOB in un database Oracle. Voglio essere in grado di impostare l'intestazione 'Content-Length' quando si restituisce un oggetto memorizzato, il che significa che ho bisogno di conoscere la dimensione del BLOB prima di iniziare a scriverlo sul client (so che potrei usare la codifica chunked, e sono in alcuni casi). Qualcuno ha esperienza con l'impatto sulle prestazioni che chiama dbms_lob.getlength() avrà su ogni lettura o dovrei calcolare la dimensione BLOB su INSERT e memorizzarla nella tabella? In media, mi aspetto che i tassi di scrittura siano più alti dei tassi di lettura. Sto scrivendo un punto di riferimento in questo momento per provare a vedere quale sia l'impatto, ma sembra una domanda così comune che ho pensato che qualcuno avrebbe già potuto capirlo. Inoltre, usando JDBC/Spring 3, come potrei calcolare la dimensione del BLOB in scrittura? (e non posso usare trigger o stored procedure) Grazie.Blob Oracle: dimensioni del negozio o calcolo?

+1

Misura, misura, misura. Le ipotesi sono solo supposizioni. – skaffman

+0

Come sempre, ma con qualcosa come Oracle (usato da migliaia) questo sembrava un paradigma piuttosto frequente e uno che molti DBA hanno già affrontato. Se ci fossero dei "trucchi", mi piacerebbe saperlo. – Gandalf

risposta

6

Ho fatto un controllo rapido selezionando un BLOB da una tabella e poi un LENGTH (BLOB) e DBMS_LOB.GETLENGTH (BLOB). Selezionando il BLOB stesso, ho ottenuto 44 risultati coerenti. Quando ho selezionato la lunghezza (con entrambi i metodi) ho ottenuto 7 risultati coerenti.

In base a ciò, quando ottengo la lunghezza, non recupera l'intero blob e ne calcola la lunghezza. È ragionevole assumere che la lunghezza memorizzata all'inizio del BLOB (come la lunghezza di un valore VARCHAR2 è memorizzata) e che venga utilizzata direttamente.

Come tale, non ci dovrebbe essere un grande sovraccarico nel derivare la lunghezza piuttosto che memorizzarla. Riduce anche la possibilità di un'incoerenza.

+0

C'è un INDICE LOB che è un segmento separato, quindi se il LOB non può essere memorizzato in linea, può trovare rapidamente quanti blocchi devono essere utilizzati. In breve, l'OP dovrebbe, quando recupera un singolo LOB, recuperare DBMS_LOB.GETLENGTH() allo stesso tempo invece di memorizzare un valore potenzialmente non corretto. –

+0

Inoltre, con 11g è possibile utilizzare una colonna virtuale per fornire la lunghezza del blob. – JavaRocky

0

Dal momento non vedo alcuna risposta ancora ..

non ho personalmente misurato nulla, ma il nostro DBA raccomandato immagazzinare le loro dimensioni (lo so, è solo che mi ha detto così). È piuttosto bravo, quindi personalmente credo che la memorizzazione delle dimensioni sia la strada da percorrere, almeno se si tratta di prestazioni critiche (avremmo dovuto chiamare .length() A LOT).

+2

Alcuni DBA diranno qualsiasi cosa vecchia. Un buon DBA sarà in grado di far saltare un esempio di codice per giustificare le loro asserzioni. – APC

2

Perché i nostri CHIAZZE comprimono bene in generale, abbiamo preso questo approccio: -

  • negozio BLOB compresso. La compressione viene eseguita sul lato java mentre lo stream è
  • registra la dimensione non compressa in byte in un'altra colonna nella stessa tabella
  • decomprimi tramite uno stream mentre inviamo di nuovo il BLOB fuori, sapendo quale sia la dimensione del contenuto sarà

Potresti considerare questo approccio se i tuoi BLOB sono comprimibili.

Problemi correlati