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_x

SQL*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"



Post popolari in questo blog

ORA-12154: TNS: il listener non è attualmente a conoscenza del servizio richiesto nel descrittore di connessione

Create e Drop Pluggable Database