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

SQL Loader, Triggersättigung?

Sie sind bereits auf halbem Weg zur Lösung:

Dies ist keine Überraschung. Ihre aktuelle Implementierung führt viele einzelne Zeilen-SELECT-Anweisungen für jede Zeile aus, die Sie in Tabelle B einfügen. Dadurch erhalten Sie unweigerlich ein schlechtes Leistungsprofil. SQL ist eine mengenbasierte Sprache und funktioniert besser mit mehrzeiligen Operationen.

Sie müssen also einen Weg finden, alle SELECT-Anweisungen durch effizientere Alternativen zu ersetzen. Dann können Sie die Auslöser dauerhaft löschen. Ersetzen Sie beispielsweise die Suchen im Wörterbuch durch Fremdschlüssel zwischen den Spalten der Tabelle A und der Referenztabelle. Einschränkungen der relationalen Integrität, die interner Oracle-Code sind, funktionieren viel besser als jeder Code, den wir schreiben können (und funktionieren auch in Umgebungen mit mehreren Benutzern).

Problematischer ist die Regel, nicht in Tabelle A einzufügen, wenn eine Kombination von Spalten bereits in Tabelle B existiert. Nicht weil es schwierig ist, sondern weil es sich nach schlechtem relationalem Design anhört. Wenn Sie keine Datensätze in Tabelle A laden möchten, wenn sie bereits in Tabelle B vorhanden sind, warum laden Sie nicht direkt in Tabelle B? Oder vielleicht haben Sie eine Teilmenge von Spalten, die aus Tabelle A und extrahiert werden sollten Tabelle B und in Tabelle C gebildet (die Fremdschlüsselbeziehungen zu A und B haben würde)?

Abgesehen davon können Sie dies mit mengenbasiertem SQL tun, indem Sie SQL*Loader durch eine externe Tabelle ersetzen. Mit einer externen Tabelle können wir der Datenbank eine CSV-Datei so präsentieren, als wäre es eine normale Tabelle. Das bedeutet, dass wir es in normalen SQL-Anweisungen verwenden können. Erfahren Sie mehr.

Mit Fremdschlüsselbeschränkungen für das Wörterbuch und eine externe Tabelle können Sie also den SQL Loader-Code durch diese Anweisung ersetzen (vorbehaltlich aller anderen Regeln, die in "... und so weiter" subsumiert werden):

insert into table_a
select ext.* 
from external_table ext
     left outer join table_b b
     on (ext.name = b.name and ext.last_name = b.last_name and ext.dept=b.dept)
where b.name is null
log errors into err_table_a ('load_fail') ;

Dabei wird die DML-Fehlerprotokollierungssyntax verwendet, um Einschränkungsfehler für alle Zeilen satzbasiert zu erfassen. Weitere Informationen . Es werden keine Ausnahmen für Zeilen ausgelöst, die bereits in Tabelle B vorhanden sind. Sie können entweder die Mehrtabelle INSERT ALL um Zeilen in eine Überlauftabelle zu leiten oder eine MINUS-Set-Operation nach dem Ereignis zu verwenden, um Zeilen in der externen Tabelle zu finden, die nicht in Tabelle A enthalten sind. Hängt von Ihrem Endziel ab und davon, wie Sie Dinge melden müssen.

Vielleicht eine komplexere Antwort, als Sie erwartet haben. Oracle SQL ist eine sehr umfangreiche SQL-Implementierung mit vielen Funktionen zur Verbesserung der Effizienz von Massenoperationen. Es zahlt sich wirklich aus, den Konzeptleitfaden und die SQL-Referenz zu lesen, um herauszufinden, wie viel wir mit Oracle erreichen können.