Performance-Problem mit Oracle Merge-Anweisungen mit mehr als 2 Millionen Datensätze
Ich bin dem ausführen der unten MERGE-Anweisung für Insert-Update-Vorgang.
Es ist in Ordnung, für 1 bis 2 Millionen Datensätze, sondern für mehr als 4 bis 5 Milliarden Datensätze es dauert 6 bis 7 Stunden.
Kann jemand empfehlen einige alternative oder performance-Tipps für Merge-Anweisung
merge into employee_payment ep
using (
select
p.pay_id vista_payroll_id,
p.pay_date pay_dte,
c.client_id client_id,
c.company_id company_id,
case p.uni_ni when 0 then null else u.unit_id end unit_id,
p.pad_seq pay_dist_seq_nbr,
ph.payroll_header_id payroll_header_id,
p.pad_id vista_paydist_id,
p.pad_beg_payperiod pay_prd_beg_dt,
p.pad_end_payperiod pay_prd_end_d
from
stg_paydist p
inner join company c on c.vista_company_id = p.emp_ni
inner join payroll_header ph on ph.vista_payroll_id = p.pay_id
left outer join unit u on u.vista_unit_id = p.uni_ni
where ph.deleted = '0'
) ps
on (ps.vista_paydist_id = ep.vista_paydist_id)
when matched then
update
set ep.vista_payroll_id = ps.vista_payroll_id,
ep.pay_dte = ps.pay_dte,
ep.client_id = ps.client_id,
ep.company_id = ps.company_id,
ep.unit_id = ps.unit_id,
ep.pay_dist_seq_nbr = ps.pay_dist_seq_nbr,
ep.payroll_header_id = ps.payroll_header_id
when not matched then
insert (
ep.employee_payment_id,
ep.vista_payroll_id,
ep.pay_dte,
ep.client_id,
ep.company_id,
ep.unit_id,
ep.pay_dist_seq_nbr,
ep.payroll_header_id,
ep.vista_paydist_id
) values (
seq_employee_payments.nextval,
ps.vista_payroll_id,
ps.pay_dte,
ps.client_id,
ps.company_id,
ps.unit_id,
ps.pay_dist_seq_nbr,
ps.payroll_header_id,
ps.vista_paydist_id
) log errors into errorlog (v_batch || 'EMPLOYEE_PAYMENT') reject limit unlimited;
- 4 bis 5 Milliarden ist ziemlich hoch, man kann es nicht vergleichen es mit 1 oder 2 Millionen.
- Erstens gibt es fünf Tabellen in die Abfrage, wie viele Zeilen in jedem? Zweitens, wie ist die Leistung der Abfrage in der USING-Klausel?
- Vielen Dank David , Das ist richtig Vergleich von 1-2 Millionen Datensätze ist nicht gut mit 4-5 Millionen. Ich Suche eine Möglichkeit, die ich finden kann Alternative für MERGE für 5-7 Millionen Datensätze. Momentan Einträge mit Firma - 30K-Einheit -1235038 und payroll_header= 12,95,65,175 und Es ist wirklich schwer SQL mit einem solchen Volumen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verarbeitung viele Daten-viel Zeit...
Hier sind einige Dinge, die Ihnen helfen können (vorausgesetzt, es ist kein probolem mit schlechtem Ausführungsplan):
Hinzufügen einer where-Klausel in der UPDATE-Teil nur aktualisieren von Datensätzen, wenn die Werte tatsächlich Verschieden sind. Wenn Sie zum Zusammenführen der gleichen Daten immer und immer wieder und nur eine kleinere Teilmenge der Daten, die tatsächlich geändert, wird dies die Leistung zu verbessern.
Wenn Sie in der Tat sind die Bearbeitung der gleichen Daten immer und immer wieder, zu untersuchen, ob Sie können einige änderungen flag/Datum nur Bearbeiten, neue Datensätze seit dem letzten mal.
Abhängig von der Art der Umgebung und Wann/für wen ist die Aktualisierung Ihrer Quell-Tabellen, zu untersuchen, ob ein truncate-einfügen " - Ansatz ist vorteilhaft. Denken Sie daran, die Indizes unusuable auf, bevor die hand.
Ich denke, Ihre beste Wette ist hier zu nutzen, die Muster in Ihren Daten. Dies ist etwas, was oracle nicht kennen, so müssen Sie möglicherweise kreativ zu werden.
Versuchen, mithilfe von Oracle Hinweise:
Versuchen, mit Tipps zur Optimierung inner mithilfe von query.