2009-05-28 7 views
3

Comment importer un script avec 3954275 Lignes d'instructions Insert dans Oracle 10g. Je peux le faire avec sqlplus user/pass @ script.sql mais c'est dam lent (encore pire le commit est à la fin de ce fichier de 900 Mo. Je ne sais pas si ma configuration Oracle peut gérer cela). Existe-t-il une meilleure façon (plus rapide) d'importer les données? Btw. la base de données est vide avant l'importation.Importation 3954275 Insertion d'instructions dans Oracle 10g

Répondre

8

Utilisez SQL*Loader.

Il peut analyser même vos commandes INSERT si vous n'avez pas vos données dans un autre format.

0

Conforme à ce qui précède: utilisez SQL * Loader.

Toutefois, si ce n'est pas une option, vous pouvez ajuster la taille des blocs que SQL Plus apporte en mettant la déclaration

SET arraysize 1000; 

au début de votre script. Ceci est juste un exemple de mes propres scripts, et vous devrez peut-être ajuster à vos besoins compte tenu de la latence, etc. Je pense que par défaut, il est de 15, donc vous obtenez beaucoup de frais généraux dans votre script.

3

SQL * Loader est une bonne alternative si votre fichier de 900 Mo contient des instructions d'insertion dans la même table. Ce sera encombrant s'il contient de nombreuses tables. C'est l'option la plus rapide cependant.

Si, pour une raison quelconque, une légère amélioration est suffisante, assurez-vous que le paramètre CURSOR SHARING de vos sessions est réglé sur FORCE ou SIMILAR. Chaque instruction d'insertion dans votre fichier sera probablement la même à l'exception des valeurs. Si CURSOR_SHARING est défini sur EXACT, chaque instruction insert doit être analysée de manière stricte, car elle est unique. FORCE et SIMILAR convertissent automatiquement vos littéraux dans la clause VALUES pour lier les variables, supprimant ainsi la nécessité d'une analyse syntaxique encore et encore.

Vous pouvez utiliser le script ci-dessous pour tester ceci:

set echo on 
alter system flush shared_pool 
/
create table t 
(id int 
, name varchar2(30) 
) 
/
set echo off 
set feedback off 
set heading off 
set termout off 
spool sof11.txt 
prompt begin 
select 'insert into t (id,name) values (' || to_char(level) || ', ''name' || to_char(level) || ''');' 
    from dual 
connect by level <= 10000 
/
prompt end;; 
prompt/
spool off 
set termout on 
set heading on 
set feedback on 
set timing on 
@sof11.txt 
set timing off 
alter session set cursor_sharing = force 
/
set timing on 
@sof11.txt 
set timing off 
alter session set cursor_sharing = exact 
/
set echo off 
drop table t purge 
/

L'exemple exécute 10.000 déclarations comme "insérer dans t (id, nom) VALUES (1, 'nom1'); ". La sortie sur mon ordinateur portable:

SQL> alter system flush shared_pool 
    2/

Systeem is gewijzigd. 

SQL> create table t 
    2 (id int 
    3 , name varchar2(30) 
    4 ) 
    5/

Tabel is aangemaakt. 

SQL> set echo off 

PL/SQL-procedure is geslaagd. 

Verstreken: 00:00:17.10 

Sessie is gewijzigd. 


PL/SQL-procedure is geslaagd. 

Verstreken: 00:00:05.50 

Plus de 3 fois plus rapide avec CURSOR_SHARING réglé sur FORCE.

Espérons que cela aide.

Cordialement, Rob.

Questions connexes