Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Schnellste Möglichkeit, Feldvergleiche in derselben Tabelle mit großen Datenmengen in Oracle durchzuführen

Zunächst einmal glaube ich, dass Ihre Aufgabe mit einfachem SQL implementiert werden kann (und sollte). Keine ausgefallenen Cursor, keine Schleifen, nur Auswahlen, Einfügungen und Aktualisierungen. Ich würde mit dem Entpivotieren Ihrer Quelldaten beginnen (es ist nicht klar, ob Sie einen Primärschlüssel haben, um zwei Sätze zu verbinden, ich denke, Sie haben es):

Col0_PK    Col1    Col2    Col3    Col4
----------------------------------------
Row1_val   A       B       C       D
Row2_val   E       F       G       H

Oben sind Ihre Quelldaten. Verwenden von UNPIVOT Klausel wir wandeln es um in:

Col0_PK     Col_Name    Col_Value
------------------------------
Row1_val    Col1        A
Row1_val    Col2        B
Row1_val    Col3        C
Row1_val    Col4        D
Row2_val    Col1        E
Row2_val    Col2        F
Row2_val    Col3        G
Row2_val    Col4        H

Ich denke, du verstehst es. Angenommen, wir haben Tabelle1 mit einem Datensatz und die gleiche strukturierte Tabelle2 mit dem zweiten Datensatz. Es ist eine gute Idee, indexorganisierte Tabellen zu verwenden.

Der nächste Schritt besteht darin, Zeilen miteinander zu vergleichen und Differenzdetails zu speichern. Etwas wie:

insert into diff_details(some_service_info_columns_here)
 select some_service_info_columns_here_along_with_data_difference
  from table1 t1 inner join table2 t2
     on t1.Col0_PK = t2.Col0_PK
    and t1.Col_name = t2.Col_name
    and nvl(t1.Col_value, 'Dummy1') <> nvl(t2.Col_value, 'Dummy2');

Und im letzten Schritt aktualisieren wir die Übersichtstabelle der Unterschiede:

insert into diff_summary(summary_columns_here)
 select diff_row_id, count(*) as diff_count
  from diff_details
 group by diff_row_id;

Es ist nur ein grober Entwurf, um meinen Ansatz zu zeigen, ich bin sicher, es sollten noch viel mehr Details berücksichtigt werden. Zusammenfassend schlage ich zwei Dinge vor:

  1. UNPIVOT Daten
  2. Verwenden Sie SQL Anweisungen anstelle von Cursorn