SQL*Loader express mode
Carica i dati da un file esterno senza definire un control file ed è più veloce del classico loader perchè carica la tabella utilizzando insert parallele con l'opzione "append" che dice ad Oracle di utilizzare il metodo di caricamento "direct path".
Vediamo un esempio. Collegarsi ad un plubggable database come hr:
SQL> show user;
USER è "HR"
SQL> show con_name;
CON_NAME------------------------------
ORCLPDB
Creare tabelle così fatte:
SQL> create table dept_x
(deptno number,
dname varchar2(100),
constraint dept_x primary key (deptno)
);
SQL> insert into dept_x values (1, 'sales');
commit;
SQL> select * from dept_x;
SQL> create table emp_x
( empid number,
name varchar2(10) not null,
gender varchar(1),
deptno number,
address varchar2(100),
constraint emp_x_pk primary key (empid),
constraint emp_x_uk1 unique (name),
constraint emp_x_fk1 foreign key (deptno) references dept_x(deptno),
constraint emp_x_chq1 check ( gender in ('M','F') )
);
Carichiamo nella direcotry
/u01/app/oracle/file_ext
un file .csv così fatto
Rinominare il file
[oracle@test file_ext]$ mv emp_x.csv emp_x.dat
Lanciare sotto lo stesso path il comando:
[oracle@test file_ext]$ sqlldr hr/hr@orclpdb TABLE=emp_xSQL*Loader: Release 18.0.0.0.0 - Production on Mon Nov 2 15:11:25 2020
Version 18.3.0.0.0
Copyright (c) 1982, 2018, Oracle and/or its affiliates. All rights reserved.
Express Mode Load, Table: EMP_X
Path used: External Table, DEGREE_OF_PARALLELISM=AUTO
Table EMP_X:
300 Rows successfully loaded.
Check the log files:
emp_x.log
emp_x_%p.log_xt
Dal log si evince che SQL*Loader segue questi step:
A) Crea prima una control file
LOAD DATA
INFILE 'emp_x'
APPEND
INTO TABLE EMP_X
FIELDS TERMINATED BY ","
(
EMPID,
NAME,
GENDER,
DEPTNO,
ADDRESS
)
B) Abilita l'inseirmento in parallelo
ALTER SESSION ENABLE PARALLEL DML
C) Crea una tabella esterna in cui caricare i dati esterni
CREATE TABLE "SYS_SQLLDR_X_EXT_EMP_X"
(
"EMPID" NUMBER,
"NAME" VARCHAR2(10),
"GENDER" VARCHAR2(1),
"DEPTNO" NUMBER,
"ADDRESS" VARCHAR2(100)
)
ORGANIZATION external
(
TYPE oracle_loader
DEFAULT DIRECTORY EXT_DIR
ACCESS PARAMETERS
(
RECORDS DELIMITED BY NEWLINE CHARACTERSET US7ASCII
BADFILE 'EXT_DIR':'emp_x_%p.bad'
LOGFILE 'emp_x_%p.log_xt'
READSIZE 1048576
FIELDS TERMINATED BY "," LRTRIM
REJECT ROWS WITH ALL NULL FIELDS
(
"EMPID" CHAR(255),
"NAME" CHAR(255),
"GENDER" CHAR(255),
"DEPTNO" CHAR(255),
"ADDRESS" CHAR(255)
)
)
location
(
'emp_x.dat'
)
)REJECT LIMIT UNLIMITED
D) Inserisce le righe nella tabella emp_x con il comando APPEND.
Questo dice all'optimizer oracle di eseguire una direct-path insert che migliora le performance di una semplice operazione INSERT .. SELECT prechè i dati sono "appesi" alla fine della tabella dopo l'Hwm (High water mark) piuttosto che tentare di usare spazio libero all'interno della tabella.
I dati sono scritti direttamente sui data files, bypassando il buffer cache.INSERT /*+ append parallel(auto) */ INTO EMP_X
(
EMPID,
NAME,
GENDER,
DEPTNO,
ADDRESS
)
SELECT
"EMPID",
"NAME",
"GENDER",
"DEPTNO",
"ADDRESS"
FROM "SYS_SQLLDR_X_EXT_EMP_X"
E) Infine esegue il drop della tabella esterna "SYS_SQLLDR_X_EXT_EMP_X"