Einlesen von BLOBs mit dem Oracle SQL*Loader

Hallo,

ich muss einige Millionen Datensätze regelmässig in Oracle 10g Release 2 einlesen.
Ich bin sicher, dass sqlldr die notwendige Performance für die text-Daten bringen kann. Aber den Datensätzen sind kleine Bilder ((in der DB als BLOB) zugeordnet, die derzeit jeweils als einzelne Datei vorliegen.
Momentan nutze ich zum Einlesen der Bilder die Control File Option
ext_fname FILLER CHAR(40),
„DATA“ LOBFILE(ext_fname) TERMINATED BY EOF

Statt dessen würde ich lieber die Bilder (analog zu den verschiedenen Datenfiles) zusammenfassen, so dass sie in einigen wenigen grossen Dateien vorliegen (da die Bilddateien durch einen vorgeschalteten Prozess erzeugt werden, ginge das problemlos).
Dadurch müsste der Loader nicht so viele kleine Dateien öffnen, sollte also schneller sein.
Nebeneffekt: Auch der Plattenplatz für die grossen Dateien müsste weit geringer sein.

Soweit zur Motivation. Die Frage nun:
Geht das überhaupt?
Kann man dem SQL Loader - am besten mit der zugehörigen Byte-Länge - sagen, er soll mehrere BLOBS aus einer Datei lesen?

Oder weiss jemand sogar noch was besseres?

Viele Grüsse aus dem sonnig-kalten Schwarzwald,
Mattin

Hallo,

ich glaube mal nicht, dass das soooo viel ausmachen wird. Wenn Du wirklich ein Performance Problem hast, kannst Du ja versuchen, logging, constraints und indexe während des Ladevorgangs auszuschalten. (Falls das der loader nicht schon automatisch tut.

Auf jeden Fall kannst Du das mit PL/SQL in der DB machen. Ich schätze, DBMS_BLOB stellt Dir Methoden zur Verfügung, um die Blobs zurechtzuschneiden. (Einen großen Blob in eine temporäre Tabelle einlesen und verteilen)

Es geht auf jeden Fall auch mit Java.

Gruß

Peter

Hi,

wenn man - was bei der einzulesenden Datenmenge notwendig ist, den „Direct Path Mode“ des SQL*Loaders benutzt, so sind Indizes, Trigger und Constraints für die Ladezeit ausgeschaltet. Das ist sicher auch die einzige Möglichkeit, innerhalb weniger Stunden ca. 50 Mio Datensätze in Oracle zu bekommen.
Mit PL/SQL werde ich an der Stelle sicher nicht schneller sein (meines Wissens nach ist PL/SQL wie Java eine Interpreter-Sprache) - der Direct Path Mode des SQL Loaders umgeht einige Schichten im RDBMS und schreibt direkt Datenblöcke anstatt Inserts auszuführen (spart z.B. bei den Locks).
Mit anderen Worten: Beim Direct Path Mode kann ich an einigen Parametern (Puffergrössen) rumspielen und auch einiges erreichen.
Hauptsächlich geht es nun aber darum, die I/O-Last des Systems zu optimieren (z.B. durch Lesen von verschiedenen Platten und schreiben in verschiedene Partitionen machbar, so dass parallel gearbeitet werden kann).
Eine weitere Möglichkeit, die ich gesehen habe, um I/O-Last zu minimieren, wäre eben gewesen, dass der Loader nicht 50 Mio. kleine BLOB-Files öffnen muss, sondern z.B. „nur“ 50.000 (die dann jeweils 1000 Bilder beinhalten). Leider scheint der SQL Loader das aber nicht zu unterstützen.
Bleiben also noch Tuning-Möglichkeiten über das File-System (Blockgrösse)…

Grüsse aus dem (heute verregneten) Schwarzwald,
Mattin

Lsg: Einlesen von BLOBs mit dem Oracle SQL*Loader
Im Controlfile den Datentyp VARRAWC verwenden:

data LOBFILE(CONSTANT ‚abc/vd-img.lob‘) VARRAWC(4,4096)

Hat auf einer Solaris9 2-Prozessormaschine 20% Ersparnis ausgemacht, bei mehreren parallelen Ladevorgängen sogar noch mehr. (Ja, das hängt von den verschiedensten Faktoren ab: Image-Grösse, Disks, … - aber hey: 20% is doch mal eine interessante Steigerung :wink:

Grüsse aus dem sonnigen Schwarzwald,
Mattin