2. Datenbankworkshop der Ag Bioinformatik Oracle SQL*Loader Loader Einsatzmöglichkeit für den Import von Massendaten Christian Künne IPK
Überblick Oracle SQL*Loader - Hintergrund - Anmerkungen - Funktionsweise - Kommandozeile - Aufbau der Steuerdatei - Performancesteigerung - Beispiele Literatur - K. Loney und G. Koch, ORACLE 9i The Complete Reference bzw. ORACLE 9i Die umfassende Referenz, Oracle Press - Oracle 9i - Database Utilities, Oracle Dokumentation Christian Künne - Datenbankworkshop: SQL*Loader 2
Hintergrund SQL-Anweisung INSERT fügt Daten in Tabellen ein Einsatz - Manuelles Einfügen einzelner Datensätze aus SQL Plus oder einer Datenbankanwendung - SQL-Skripte mit mehreren INSERT-Anweisungen Problem - Hoher Aufwand bei Einfügeoperationen von sehr vielen Datensätzen Lösung - Oracle Werkzeug SQL*Loader Christian Künne - Datenbankworkshop: SQL*Loader 3
Anmerkungen SQL*Loader ist ein Oracle Werkzeug und arbeitet nur mit Oracle Datenbanken Lädt Daten aus externen Dateien in Tabellen Importdaten sollten strukturiert vorliegen Ist flexibel und ermöglicht Manipulation der Daten beim Laden Lädt Massendaten schneller als SQL-Skript INSERTs und läßt sich mit der Direct Path Option weiter beschleunigen Christian Künne - Datenbankworkshop: SQL*Loader 4
Funktionsweise SQL*Loader Steuerdatei und externe Datei mit Importdaten notwendig Kommandozeilenaufruf (parametrisierbar): sqlldr [user@database] control=steuerdatei.ctl Nach Start des Ladevorgangs - Einfügen der Daten aus externer Datei in Tabellen nach Vorgaben in der Steuerdatei - Anlegen einer Log-Datei zur Protokollierung des Imports - Ggf. Anlegen einer Bad-Datei für zurückgewiesene Import-Datensätze (durch SQL*Loader oder Oracle DB-Server) - Ggf. Anlegen einer Discard-Datei für Import-Datensätze, die den Importkriterien nicht genügen Christian Künne - Datenbankworkshop: SQL*Loader 5
Funktionsweise (2) Quelle: Oracle 9i - Database Utilities, Oracle Dokumentation, S. 181 Christian Künne - Datenbankworkshop: SQL*Loader 6
Kommandozeile Verwendung: SQLLDR keyword=value [,keyword=value,...] Wichtige Parameter: - userid=scott/tiger oder scott@bimi - control=steuerdatei.ctl Alle weiteren Parameter: - userid - control - log - bad - data - discard - discardmax - skip - load - errors - rows - bindsize - silent - direct - parfile - parallel - file - skip_unusable_indexes - skip_index_maintenance - readsize - external_table - columnarrayrows - streamsize - multithreading - resumable - resumable_name - resumable_timeout - date_cache Christian Künne - Datenbankworkshop: SQL*Loader 7
Aufbau der Steuerdatei Einfache Textdatei mit SQL*Loader DDL Befehlen Drei Blöcke - Sessionspezifische Informationen - Tabellen- und Feldinformationen - Inputdaten (optional) -- This is a sample control file LOAD DATA INFILE sample.dat BADFILE sample.bad DISCARDFILE sample.dsc APPEND INTO TABLE emp WHEN (57) =. TRAILING NULLCOLS ( hiredate SYSDATE, deptno POSITION(1:2) INTEGER EXTERNAL(2) NULLIF deptno=blanks, job POSITION(7:14) CHAR TERMINATED BY WHITESPACE NULLIF job=blanks "UPPER(:job)", mgr POSITION(28:31) INTEGER EXTERNAL TERMINATED BY WHITESPACE, NULLIF mgr=blanks, ename POSITION(34:41) CHAR TERMINATED BY WHITESPACE "UPPER(:ename)", empno POSITION(45) INTEGER EXTERNAL TERMINATED BY WHITESPACE, sal POSITION(51) CHAR TERMINATED BY WHITESPACE "TO_NUMBER(:sal, $99,999.99 )", comm INTEGER EXTERNAL ENCLOSED BY ( AND % ":comm * 100" ) Christian Künne - Datenbankworkshop: SQL*Loader 8
Aufbau der Steuerdatei (2) Kommandozeilenparameter in Steuerdatei einsetzbar (OPTION (keyword=value [,keyword=value,...])) Mehrere Datendateien bzw. Inputdaten in Steuerdatei möglich Gleichzeitiges Einfügen in mehreren Tabellen möglich In Steuerdatei spezifizierte Spalten - müssen mit Spalten der Tabelle korrespondieren - haben SQL*Loader-spezifische Datentypen portabele (CHAR, Datetime, Numeric EXTERNAL (INTEGER, FLOAT, DECIMAL, ZONED), RAW,... ) nicht portabele, plattformabhängig (INTEGER, SMALLINT, DOUBLE, FLOAT, VARCHAR,... ) Nicht spezifizierte Tabellenspalten werden mit NULL gefüllt Christian Künne - Datenbankworkshop: SQL*Loader 9
Aufbau der Steuerdatei (3) Temporäre Spalten (filler fields) in der Steuerdatei (FILLER) korrespondieren zu Feldern in Datendatei, haben aber keine korrespondierenden Spalten in Tabelle Begrenzung/Eingrenzung von Feldern (TERMINATED BY/ENCLOSED BY) Bedingungsklauseln für Datenfelder (WHEN, NULLIF und DEFAULTIF) und Vergleichsoperatoren SQL-Operatoren auf Datenfelder anwendbar (z.b. UPPER()) Einfügen eindeutiger Sequenzwerte (SEQUENCE) Weitere Details siehe Dokumentation Christian Künne - Datenbankworkshop: SQL*Loader 10
Performancesteigerung Ladeprozesse außerhalb der DB Nutzungskernzeiten Deaktivierung der Redo Log Einträge durch Option unrecoverable (nur bei Direct Path Loading) oder direkt am Objekt (z.b. Tabelle) durch nologging Parallelisierung des Ladevorgangs durch mehrere gleichzeitige Ladeprozesse mit Option parallel Löschen oder Deaktivieren aller Indizes, Trigger und überflüssigen Integritätsregeln auf Zieltabelle(n) Reservierung von genügend Speicherplatz für Zieltabelle(n) zur Vermeidung von dynamischen Erweiterungen während Ladeprozeß Einrichtung mehrerer DBWR (Database Writer)-Prozesse zur Optimierung des Schreibprozesses der Daten Christian Künne - Datenbankworkshop: SQL*Loader 11
Direct Path Loading Performancesteigerung (2) - Viel schneller als konventionelles Laden - Schreiben von vorformatierten Blöcken (Oracle data blocks) direkt in Datenbankdateien statt generierter SQL INSERT Befehle beim konventionellen Laden - unrecoverable keine Redo Log Einträge - parallel mehrere gleichzeitige Path Load Sessions - Direktes Laden einzelner Partitionen bei Partitionierung einer Tabelle - Einschränkungen siehe Dokumentation Christian Künne - Datenbankworkshop: SQL*Loader 12
Beispiele Steuerdatei inkl. Daten LOAD DATA INFILE * INTO TABLE dept FIELDS TERMINATED BY, OPTIONALLY ENCLOSED BY " (deptno, dname, loc) BEGINDATA 12,RESEARCH,"SARATOGA" 10,"ACCOUNTING",CLEVELAND 11,"ART",SALEM 13,FINANCE,"BOSTON" 21,"SALES",PHILA. 22,"SALES",ROCHESTER 42,"INT L","SAN FRAN" Steuerdatei LOAD DATA INFILE ulcase2.dat INTO TABLE emp ( empno POSITION(01:04) INTEGER EXTERNAL, ename POSITION(06:15) CHAR, job POSITION(17:25) CHAR, mgr POSITION(27:30) INTEGER EXTERNAL, sal POSITION(32:39) DECIMAL EXTERNAL ) Datendatei 7782 CLARK MANAGER 7839 2572.50 7934 MILLER CLERK 7782 920.00 7566 JONES MANAGER 7839 3123.75 7499 ALLEN SALESMAN 7698 1600.00 Christian Künne - Datenbankworkshop: SQL*Loader 13
Beispiele (2) Steuerdatei Datendatei LOAD DATA INFILE 'clones_import.dat' BADFILE 'clones.bad' DISCARDFILE 'clones.dsc' APPEND INTO TABLE clone FIELDS TERMINATED BY ',' ( clone_nr SEQUENCE(MAX,1), clone_id CHAR, library_id CHAR, shippable INTEGER EXTERNAL ) HA02C13,HA,0 HB27H21,HB,0 HD05N04,HD,0 HF01K08,HF,0 HM08K09,HM,0 HO00C01,HO,0 HP09A06,HP,0 HT07L05,HT,0 HU10H07,HU,0 HV10D10,HV,0 HX06D02,HX,0 HY03B21,HY,0 HY03I08,HY,0 HZ01C03,HZ,0 Christian Künne - Datenbankworkshop: SQL*Loader 14
Beispiele (3) Steuerdatei LOAD DATA INFILE 'load_seq.dat' BADFILE 'load_seq.bad' DISCARDFILE 'load_seq.dsc' APPEND INTO TABLE est_seq FIELDS TERMINATED BY ' ' ( est_seq_id CHAR, library_id CHAR, clust_proj INTEGER EXTERNAL, "SEQUENCE" LOBFILE(CONSTANT 'load_seq.lob') TERMINATED BY "<end>\n", entry_date DATE "DD-MM-YYYY" ) Datendatei GAN002A01f GAN 3 01-10-2002 GBN002M20f GBN 3 01-10-2002 GCW003H21r GCW 3 01-10-2002 GNW002P06r GNW 3 01-10-2002 GW001M22r GW 3 01-10-2002 LOB-Datei AGCAGCGCCTT CTGTGTT<end> GCGGCCGCTCG TCTTGGTAATCTT<end> GATCTGCTCTG TGCAGATTAT<end> CTGATAAGAAT ATAAT<end> AATTATCTTAC ACTCACTGTTG<end> Christian Künne - Datenbankworkshop: SQL*Loader 15
Beispiele (4) Steuerdatei LOAD DATA INFILE 'score_spool.txt' BADFILE 'load_seq_score.bad' DISCARDFILE 'load_seq_score.dsc' REPLACE INTO TABLE est_seq_score FIELDS TERMINATED BY ',' ( est_seq_id CHAR, seq_score VARRAY TERMINATED BY ':' ( seq_score INTEGER EXTERNAL ) ) Datendatei HY06D18V,1,2,3,4,5,6,7,8,9,0: HY01A03T,: HY01A07T,100,200,300,400: HY01A11T,999: Christian Künne - Datenbankworkshop: SQL*Loader 16
Beispiele (5) Online Beispiel Christian Künne - Datenbankworkshop: SQL*Loader 17