2009-05-21 19 views
2

Ich habe Probleme beim Laden von Daten. Ich muss 800.000 Zeilen von einer Tabelle in eine andere in Oracle-Datenbank kopieren.Daten laden in Oracle

Ich versuchte zuerst für 10.000 Zeilen, aber die Zeit, die es dauerte, ist nicht zufriedenstellend. Ich habe versucht, die "BULK COLLECT" und "INSERT INTO SELECT" -Klausel, aber für beide Fälle ist die Reaktionszeit etwa 35 Minuten. Dies ist nicht die gewünschte Antwort, nach der ich suche.

Hat jemand irgendwelche Vorschläge?

Antwort

5

Anirban,

ein "INSERT INTO SELECT" ist der schnellste Weg, um Ihre Tabelle zu füllen. Sie können es mit einem oder zwei dieser Hinweise erweitern möchten:

  • APPEND: direkter Weg Laden zu verwenden, wird der Puffer-Cache
  • PARALLEL Umgehung: Parallelverarbeitung verwenden, wenn Ihr System mehrere CPUs hat, und das ist eine einmalige Operation oder eine Operation, die zu einer Zeit stattfindet, in der es keinen Unterschied macht, ob ein "egoistischer" Prozess mehr Ressourcen verbraucht.

nur mit dem Anfügen Hinweis auf meinem Laptop Kopie 800.000 sehr kleine Zeilen unter 5 Sekunden:

SQL> create table one_table (id,name) 
    2 as 
    3 select level, 'name' || to_char(level) 
    4  from dual 
    5 connect by level <= 800000 
    6/

Tabel is aangemaakt. 

SQL> create table another_table as select * from one_table where 1=0 
    2/

Tabel is aangemaakt. 

SQL> select count(*) from another_table 
    2/

    COUNT(*) 
---------- 
     0 

1 rij is geselecteerd. 

SQL> set timing on 
SQL> insert /*+ append */ into another_table select * from one_table 
    2/

800000 rijen zijn aangemaakt. 

Verstreken: 00:00:04.76 

Sie erwähnen, dass dieser Vorgang 35 Minuten in Ihrem Fall nimmt. Kannst du noch mehr Details posten, damit wir sehen können, was genau 35 Minuten dauert?

Grüße, Rob.

1

Ich würde mit Rob übereinstimmen. Einfügen in() select ist der schnellste Weg, dies zu tun.

Was genau müssen Sie tun? Wenn Sie versuchen, eine Tabelle Umbenennungs zu tun, indem sie in eine neue Tabelle zu kopieren und dann die alte zu löschen, könnten Sie besser dran sein, einen Tisch Umbenennungs tun:

alter table 
    table 
rename to 
    someothertable; 
1

INSERT INTO SELECT ist der schnellste Weg, es zu tun.

Wenn möglich/erforderlich, zuerst alle Indizes der Zieltabelle deaktivieren.

Wenn in der Zieltabelle keine Daten vorhanden sind, können Sie auch CREATE AS SELECT versuchen.

0

Wie oben, würde ich die Insert INTO ... AS select .... oder CREATE TABLE ... AS SELECT ... als die schnellste Möglichkeit zum Kopieren einer großen Datenmenge zwischen zwei Tabellen empfehlen.

Sie möchten den Direct-Load-Insert in Ihrer Oracle-Dokumentation nachschlagen. Dadurch werden Ihren Anweisungen zwei Elemente hinzugefügt: parallel und nologging. Wiederholen Sie die Tests aber wie folgt vor:

CREATE TABLE Table2 AS SELECT * FROM Table1 where 1=2; 
ALTER TABLE Table2 NOLOGGING; 
ALTER TABLE TABLE2 PARALLEL (10); 
ALTER TABLE TABLE1 PARALLEL (10); 
ALTER SESSION ENABLE PARALLEL DML; 
INSERT INTO TABLE2 SELECT * FROM Table 1; 
COMMIT; 
ALTER TABLE 2 LOGGING: 

Dies schaltet die Rollbacks für Einsätze in der Tabelle anzumelden. Wenn das System abstürzt, gibt es keine Wiederherstellung und Sie können die Transaktion nicht rückgängig machen. Das PARALLEL verwendet N Worker-Thread, um die Daten in Blöcken zu kopieren. Sie müssen mit der Anzahl der parallelen Worker-Threads experimentieren, um die besten Ergebnisse auf Ihrem System zu erzielen.

0

Ist die Tabelle, die Sie kopieren, in derselben Struktur wie die andere Tabelle? Hat es Daten oder erstellen Sie eine neue? Kannst du Exp/Imp benutzen?Exp kann eine Abfrage geben, um zu begrenzen, was es exportiert und dann in die Datenbank importiert. Wie groß ist die Gesamtgröße der Tabelle, aus der Sie kopieren? Wenn Sie die meisten Daten von einer Tabelle in eine zweite kopieren, können Sie stattdessen die vollständige Tabelle mit exp/imp kopieren und dann die unerwünschten Zeilen entfernen, die weniger als das Kopieren wären.

0

versuchen Sie, alle Indizes/Einschränkungen für Ihre Zieltabelle zu löschen und sie dann nach dem Laden der Daten neu zu erstellen.

Verwenden Sie /*+NOLOGGING*/ Hinweis für den Fall, dass Sie den NOARCHIVELOG-Modus verwenden, oder überlegen Sie, die Sicherung direkt nach der Operation durchzuführen.