Dies ist eher ein Zweifel als ein Problem. Ich habe die Anforderung, nur einige der allgemeinen Felder aus einer Tabelle auszuwählen und sie in eine andere Tabelle einzufügen. Ich habe den Code mit 2 verschiedenen Stilen gemacht, aber beide mit BULK COLLECT. Welches ist die bessere Option zu gehen oder gibt es einen anderen Weg abgesehen von diesem?PLSQL-Leistungsproblem
Hier finden Sie die notwendigen Details.
Verfahren (Weg 1):
create or replace procedure a2 is
cursor c1 is select id,address from emp1;
type t is table of c1%rowtype;
c t;
begin
open c1;
loop
fetch c1 bulk collect into c;
exit when c.count=0;
forall j in 1..c.count save exceptions
insert into empl1(id,address) values (c(j).id,c(j).address);
end loop;
commit;
exception when others then
for j in 1..sql%bulk_exceptions.count loop
dbms_output.put_line('The sql error is error occured');
end loop;
end a2;
/
Ausführen des obigen Verfahrens und Ausgang:
declare
a number;
begin
dbms_output.put_line ('before procedure: ' || to_char(sysdate, 'HH24:MI:SS'));
a2;
dbms_output.put_line ('after procedure: ' || to_char(sysdate, 'HH24:MI:SS'));
end;
Ausgang:
before procedure: 23:44:48
after procedure: 23:45:47
PL/SQL procedure successfully completed.
So das obige Verfahren 59 Sekunden nahm 34.801.020 einfügen Aufzeichnungen.
Jetzt finden Sie das zweite Verfahren.
Verfahren (Weg 2):
create or replace procedure a3 is
cursor c1 is select id,address from emp1;
type t is table of c1%rowtype;
c t;
begin
select id,address bulk collect into c from emp1;
forall j in 1..c.count save exceptions
insert into empl1(id,address) values (c(j).id,c(j).address);
exception when others then
for j in 1..sql%bulk_exceptions.count loop
dbms_output.put_line('The sql error is error occured');
end loop;
end a3;
/
Ausführen des obigen Verfahrens mit Ausgang.
declare
a number;
begin
dbms_output.put_line ('before procedure: ' || to_char(sysdate, 'HH24:MI:SS'));
a3;
dbms_output.put_line ('after procedure: ' || to_char(sysdate, 'HH24:MI:SS'));
end;
Ausgang:
before procedure: 23:47:57
after procedure: 23:48:53
PL/SQL procedure successfully completed.
Diese Prozedur 56 Sekunden nahm 34.801.020 Datensätze einzufügen.
Gesamtdatensätze in Emp1-Tabelle.
SQL> select count(1) from emp1;
COUNT(1)
----------
34801020
Daher meine Frage:
Welche der beiden oben genannten Methoden der beste Weg ist, die Tabelle einfügen 3 Millionen Datensätze in und bitte mir vorschlagen, wenn es eine andere bessere Weg ist, den obigen Prozess zu tun von Einfügen.
Diese Art von Fragen ist besser gefragt auf [Code Review] (http://codereview.stackexchange.com/) –
1) nicht schreien. 2) Was ist falsch mit einfach, "in Emp1 einfügen ..von ang1" ? Aufzeichnungen über 3M, ist die Zeitdifferenz pro Datensatz <0,08 Mikrosekunden. – OldProgrammer
Wenn u CAPS denken dann schreit u falsch sind. Sowieso nicht wollen, um i zu diesem Punkt streiten. Wir werden diese Verfahren in einem Scheduler setzen einmal so, dass es jede Stunde ausgeführt wird. (die Abfrage ändern würde) ich nicht den Projektcode hier hinzufügen kann. wenn ich einfügen in ausgewählten verwenden ist mir mehr als 2 Minuten. –