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
Utilisez SQL*Loader
.
Il peut analyser même vos commandes INSERT
si vous n'avez pas vos données dans un autre format.
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.
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.