Frage

Ich bin eine Datenumwandlung in PL / SQL zu schreiben, die es Daten und lädt in eine Tabelle verarbeitet. Gemäß der PL / SQL-Profiler, einer der langsamsten Teile der Umwandlung ist der tatsächliche Einsatz in die Zieltabelle. Die Tabelle besitzt einen einzigen Index.

Um die Daten für Last vorzubereiten, füllen ich eine Variable, die rowtype der Tabelle, dann legen Sie sie in der Tabelle wie folgt aus:

  

insert into mytable values r_myRow;

Es scheint, dass ich Leistung gewinnen konnte Folgendes tun:

  • Schalten Sie während des Einsatzes
  • abzumelden
  • Einfügen mehrerer Datensätze auf einmal

Sind diese Methoden sinnvoll? Wenn ja, was ist die Syntax?

War es hilfreich?

Lösung

Es ist viel besser, ein paar hundert Zeilen gleichzeitig einzufügen, mit PL / SQL-Tabellen und FORALL- in Insert-Anweisung zu binden. Einzelheiten hierzu finden Sie unter hier .

Seien Sie auch vorsichtig mit, wie Sie die PL / SQL-Tabellen erstellen. Wenn möglich, bevorzugen stattdessen zu tun alle Transformationen direkt in SQL mit „INSERT INTO t1 SELECT ...“, wie er tut Zeile-für-Zeile-Operationen in PL / SQL wird noch langsamer als SQL.

In jedem Fall können Sie auch direkt Pfadeinsätze verwenden, indem INSERT /*+APPEND*/ verwenden, die im Grunde die DB-Cache umgeht und ordnet direkt und schreibt neue Blöcke zu Datendateien. Dies kann auch die Menge der Protokollierung reduzieren, je nachdem, wie Sie es verwenden. Dies hat auch einige Auswirkungen, so lesen Sie bitte die fein Handbuch zuerst.

Schließlich, wenn Sie Kürzen und den Wiederaufbau der Tabelle kann es zu ersten Tropfen lohnen (oder unbrauchbar markieren) und später Indizes neu erstellen.

Andere Tipps

Regelmäßige Insert-Anweisungen sind die langsamste Art und Weise Daten in einer Tabelle zu erhalten und nicht für Masseneinsätze gedacht. Der folgende Artikel verweist auf viele verschiedene Techniken zur Verbesserung der Leistung: http: //www.dba-oracle .com / oracle_tips_data_load.htm

Wenn Sie den Index fallen nicht die Dinge beschleunigen genug, müssen Sie die Oracle SQL * Loader :

http://www.oracle.com/technology /products/database/utilities/htdocs/sql_loader_overview.html

Angenommen, Sie eid genommen haben, ename, sal, Job. So erstellen Sie eine Tabelle zunächst als:

SQL>create table tablename(eid number, ename varchar2(20),sal number,job char(10));

Nun Daten einfügen: -

SQL>insert into tablename values(&eid,'&ename',&sal,'&job');

Löschen Sie den Index, dann die Zeilen einfügen, dann den Index neu erstellen.

Überprüfen Sie diesen Link http://www.dba-oracle.com/t_optimize_insert_sql_performance.htm

  1. wichtigste Punkte zu berücksichtigen für Ihre Fall anhängen Hinweis, da dies zu wird direkt in die Tabelle anhängen anstelle von Freiliste verwenden. Wenn Sie sich leisten können, mit NOLOGGING Hinweis anhängen Protokollierung als die Verwendung zu deaktivieren, um es zu tun
  2. Verwenden Sie einen Bulk-Einsatz statt statt in PL / SQL Laufen
  3. Verwenden Sie sqlloaded die Daten direkt in die Tabelle zu laden, wenn Sie Daten aus einer Datei-Feed erhalten

Vielleicht eine der besten Option ist Oracle so viel wie möglich tatsächlich zu vermeiden. Ich habe durch diese selbst verwirrt, aber sehr oft ein Java-Prozess viele der Oracle-Dienstprogramme, die entweder OCI verwenden übertreffen können (sprich: SQL Plus) oder wird so viel von Ihrer Zeit in Anspruch nehmen, um richtig zu machen (sprich: SQL * Loader ).

Dies verhindert nicht spezifische Hinweise entweder (wie / APPEND /) zu verwenden.

Ich habe angenehm überrascht jedes Mal, wenn ich auf diese Art von Lösung aktiviert haben.

Cheers,

Rollo

Hier sind meine Empfehlungen auf schnellen Einsatz.

Trigger - Deaktivieren Sie alle Trigger mit einer Tabelle verbunden. Aktivieren Sie nach Einsätze abgeschlossen sind.

Index - Drop-Index und erstellen Sie es nach Ihren Einsätzen abgeschlossen sind.

Stale Statistik -. Re-Analyse von Tabellen und Indizes Statistiken

Index de-Fragmentierung - Index neu erstellen, wenn nötig Verwenden Sie keine Protokollierung -Einfüge mit INSERT APPEND (nur Oracle). Dieser Ansatz ist sehr riskant Ansatz werden keine Redo-Logs erzeugt daher können Sie ein Rollback nicht tun - eine Sicherung der Tabelle, bevor Sie beginnen, und versuchen Sie nicht auf Live-Tabellen. Überprüfen Sie, ob Ihre db hat ähnliche Option

Parallel Insert:. Parallel Einsatz wird die Arbeit schneller

Bulk Insert Verwenden Einschränkungen - Nicht viel Aufwand bei Einsätzen, aber immer noch eine gute Idee zu überprüfen, wenn es nach wie vor langsam ist auch nach dem Schritt 1

Sie können erfahren Sie mehr über http://www.dbarepublic.com/2014 /04/slow-insert.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top