Hallo,
Ich habe es jetzt einmal in einem größeren Rahmen getestet und eine Tabelle mit einem Zeitpunkt und einer Zahl angelegt.
Dann habe ich die Tabelle mit einer fortlaufenden Zahl befüllt und einem systimestamp. 1000 Einträge.
Dann habe ich folgendes Skript einmal durchlaufen lassen:
Code:
declare
v_starttime timestamp;
v_endtime timestamp;
v_duration INTERVAL DAY TO SECOND;
v_index number(19,0) := 500;
begin
select systimestamp into v_starttime from dual;
loop
exit when v_index=1500;
merge into test_zeiten a using
(select count(zahl) za from test_zeiten where zahl=v_index) b on (b.za>0) when matched then update set
a.zeit=to_date('01011901', 'ddmmyyyy') when not matched then insert (a.zahl, a.zeit) values (v_index, systimestamp);
v_index := v_index + 1;
end loop;
select systimestamp into v_endtime from dual;
v_duration := v_endtime-v_starttime;
dbms_output.put_line(v_duration);
end;
Dauer: +00 00:00:11.668108
Dann habe ich folgendes Skript durchlaufen lassen:
Code:
declare
v_starttime timestamp;
v_endtime timestamp;
v_duration INTERVAL DAY TO SECOND;
v number(1,0);
v_index number(19,0) := 1000;
begin
select systimestamp into v_starttime from dual;
loop
exit when v_index=2000;
begin
select 1 into v from test_zeiten where zahl=v_index;
update test_zeiten set zeit=to_date('01011902', 'ddmmyyyy') where zahl=v_index;
exception
when no_data_found then
insert into test_zeiten values(v_index,systimestamp);
end;
v_index := v_index + 1;
end loop;
select systimestamp into v_endtime from dual;
v_duration := v_endtime-v_starttime;
dbms_output.put_line(v_duration);
end;
Dauer: +00 00:00:00.182802
Das spricht wohl eine eindeutige Sprache, es sei denn, du zeigst mir eine reale Lösung mit Merge.
mfg, Christian
Lesezeichen