Was sind einige Best Practices für die aus einer Datenbank Binärdaten abfragt?

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

  •  03-07-2019
  •  | 
  •  

Frage

Ich bin gebeten queryability in eine Datenbank (Oracle) mit meist Binärdaten gefüllt hinzuzufügen. Also muss ich in der Lage sein, binäre Bereiche von einigen Kilobyte innerhalb eines Blobs abzufragen. Ich habe dies noch nie zuvor getan, so frage ich mich, was sind einige gute Praktiken und Gefahren zu berücksichtigen, wenn ein Projekt wie dieses zu starten.

Danke

War es hilfreich?

Lösung

Fügen Sie eine Spalte von MD5, die die MD5-Prüfsumme der BLOB-Daten ist. Alternativ können Sie eine neue Tabelle mit dem gleichen Primärschlüssel erstellen und der MD5-Spalte.

Ihr Cache-Modul außerhalb der Datenbank kann von dieser Spalte macht nicht die BLOB-Spalte zweimal in einem Cache-Hit zu haben, zurückzuholen.

oder könnten Sie die BLOB-Daten in der Datenbank löschen und speichern sie in einem Dateisystem mit dem MD5-Wert als Dateiname mit einem http-Server als Netzwerk-Dateiserver.

Andere Tipps

Ohne Ihre genauen Anforderungen zu kennen, kann ich nur einige allgemeine Anmerkungen machen.

BLOBS im Orakel ist nicht die schnellen Typen. Stellen Sie sicher, dass Sie bauen nicht auf viele Performance-Engpässe in Ihrem Design, und Sie Performance-Tests laufen auf die Funktionalität, die Sie so schnell wie möglich bauen, um sicherzustellen, es Anforderungen erfüllen werden.

dbms_lob ist dein Freund. Insbesondere können Sie die Lese- und substr-Funktion (zum Lesen von Teilen des Blobs) herauszufinden, nützlich.

Bleiben Sie weg von externem C-Stil-Verfahren - sie sind wahrscheinlich viel zu langsam. PL / SQL-Funktionen sind in der Regel viel schneller sein. Ich weiß nicht, über Java-Prozeduren. Als Java Motor ist stärker in Oracle können sie sehr gut zu bedienen. Es kann sich lohnen, ein anfängliches proof of concept tun PL / SQL gegen Java zu vergleichen.

Mit Java können Sie die Daten in einem byte [] Stream lesen und manipulieren es nach Herzenslust der Welt f Java verwenden. Externe Verfahren für Java sind einfach zu tun - Sie können sogar nur geben Oracle den Java-Quellcode

.

Für PL / SQL, eine Technik, die wir sehr nützlich gefunden haben, ist das Blob zu einem rohen zu konvertieren, als solche, dass zu ein VARCHAR und dann, dass hex konvertieren, die dann hex (strings) Manipulieren mit Standard-Oracle-String-Funktionen. Das heißt:

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

Dies würde bis zu 15Kb in Größe für Blobs arbeiten. Die retrieve_embedded Funktion kann beispielsweise in der Lage sein die erste „Byte“ zu lesen, indem ein substr(data, 1, 8) tun, dass über to_number(hexdata, 'xxxxxxxx') in eine Dezimalzahl Umwandlung verwenden Sie es als Offset ... etc.

Speicherparameter kann durchaus einen signifikanten Unterschied machen, wenn es zu den beiden Speichern und Abrufen von relativ kleinen BLOBs ( minimieren

Vielleicht ist die größte Auswirkung auf die Leistung Aktivierung oder Deaktivierung von 'IN DER REIHE Lagerung -. Es ist auf jeden Fall lohnt das Experimentieren mit

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top