Le moyen le plus rapide pour insérer un million de lignes dans Oracle
Comment puis-je insérer plus d'un million de lignes dans Oracle dans des conditions optimales pour la suite procdeure? Il se bloque si je l'augmentation de la boucle for POUR un million de lignes.
create or replace procedure inst_prc1 as
xssn number;
xcount number;
l_start Number;
l_end Number;
cursor c1 is select max(ssn)S1 from dtr_debtors1;
Begin
l_start := DBMS_UTILITY.GET_TIME;
FOR I IN 1..10000 LOOP
For C1_REC IN C1 Loop
insert into dtr_debtors1(SSN) values (C1_REC.S1+1);
End loop;
END LOOP;
commit;
l_end := DBMS_UTILITY.GET_TIME;
DBMS_OUTPUT.PUT_LINE('The Procedure Start Time is '||l_start);
DBMS_OUTPUT.PUT_LINE('The Procedure End Time is '||l_end);
End inst_prc1;
Je recommande de ne pas utiliser le curseur pour cela. Comme curseur va diminuer votre performance.
Cochez cette lien
Cochez cette lien
OriginalL'auteur user1016594 | 2013-08-24
Vous devez vous connecter pour publier un commentaire.
Votre approche conduira à des problèmes de mémoire. La façon la plus rapide sera présent [Requête édité après David commentaire de prendre soin de nulle scénario] :
Un select insert est l'approche plus rapide que tout reste dans la mémoire RAM.
Cette requête peut devenir lent si elle se glisse dans les temp de la zone, mais alors que les besoins DB réglage . Je ne pense pas qu'il y a peut être quelque chose de plus rapide que cela.
Peu plus de détails sur l'utilisation de la mémoire par la Requête:
Chaque requête aura sa propre PGA [Program global area] qui est en fait la RAM disponible pour chaque requête. Si cette zone n'est pas suffisant pour retourner les résultats de la requête SQL moteur démarre à l'aide de Golabl tablespace temp qui est comme le disque dur et de la requête commence à devenir lent. Si les données requises par la requête est tellement énorme que même temp zone n'est pas suffisant, alors vous aurez tablespace d'erreur.
Donc toujours concevoir une requête afin qu'elle reste dans la PGA d'autre de son drapeau Rouge.
ORA-30009: Not enough memory for CONNECT BY operation
premier. Ce qui est un peu bizarre, car vous pouvez résoudre l'erreur paralter session set workarea_size_policy=manual;
etalter session set sort_area_size=<large number>;
. Apparemment pas toutes "sortes" peuvent utiliser l'espace de stockage temporaire.Si dtr_debtors1 est vide, alors vous allez insérer les valeurs null dans la table. Utilisation Fusionnent(max(ssn),0).
OriginalL'auteur Lokesh
L'insertion d'une ligne à la fois avec un seul
insert
déclaration à l'intérieur de la boucle est lente. Le moyen le plus rapide est d'utiliserinsert-select
comme la suivante, ce qui génère un million de lignes et d'insertion en bloc.Grâce lokiIts de travail
OriginalL'auteur ntalbs
Essayez de supprimer tous les index créé sur votre table et puis essayez d'insérer à l'aide de la
select
requête. Vous pouvez essayer ce lien qui va vous aider dans l'insertion des millions de lignes rapide dans votre base de données.OriginalL'auteur Rahul Tripathi