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
InformationsquelleAutor user2819874 | 2014-02-10
Schreibe einen Kommentar