2017-05-01 4 views
0

Ich habe zwei identische Schemas, in verschiedenen Datenbanken über Datenbankverbindung verbunden.Oracle Einfügen mit FLASHBACK Query

Schema_1: Source Schema. **Rows being inserted at rapid rate.** 
Schema_2: Target Schema. 

Zeilen in Schema_1 (Quellschema) eingefügt zu schnellen Rate wird.

Ich bin eine SQL in Quelle Schema läuft wie folgt:

Insert into [email protected]_LINK select * from Table_1 

Diese Aussage dauert einige Minuten.

Jetzt wechsle ich die Anweisung wie folgt

Insert into [email protected]_LINK select * Table_1 as of timestamp to_timestamp (to_timestamp (date)); 

Diese Abfrage abgeschlossen ist in wenigen Sekunden (Flashback-Abfrage verwendet wird).

Warum so großer Unterschied?

+0

Haben Sie überprüft, wie viele Datensätze von den Abfragen zurückgegeben werden: 'Wählen Sie * aus Table_1' und' wählen Sie * Table_1 ab dem Zeitstempel to_timestamp (to_timestamp (date)); '? – kpater87

+0

Es gibt eine Menge Unterschied mit diesen. Die Flashback-Abfrage ist die einfachste. Es wird Flashback-Daten betrachten, um die Daten aus der lokalen Datenbank zurückzugeben. Aber die Einfügung über die Verbindung muss (1) alle Daten von der Tabelle über vollständige Tabellenscan lesen (2) die Daten zu einem entfernten System über irgendein unspezifiziertes Netz transportieren (3), das in die entfernte Tabelle mit passender Transaktion geschrieben wird control/logging/redo/etc. Für mich ist es ein Kinderspiel, dass die Flashback-Abfrage schneller ist. – unleashed

+1

Wie wirkt sich der DB-Link auf den Leistungsunterschied aus? Ist es wirklich 'to_timestamp (to_timestamp ('? Das sieht für mich falsch ... –

Antwort

1

In Ihrer Flashback-Abfrage wählen Sie die Zeilen aus, die exakt auf 05/01/2017 10:00:00 eingefügt wurden. In Ihrer Nicht-Rückblende-Abfrage wählen Sie jedoch alle in die Tabelle eingefügten Zeilen aus.

Einfache Demonstration:

SQL> create table t1(id number, name varchar2(20)); 

Table created. 

SQL> insert into t1 values(1, 'joe'); 

1 row created. 

SQL> insert into t1 values(2, 'jay'); 

1 row created. 

SQL> commit; 

Commit complete. 

SQL> insert into t1 values(3, 'john'); 

1 row created. 

SQL> commit; 

Commit complete. 

SQL> select * from t1; 

     ID NAME 
---------- -------------------- 
     1 joe 
     2 jay 
     3 john 

SQL> select * from t1 as of timestamp to_timestamp('02-MAY-17 11:00','DD-MON-RR HH24:MI'); 

     ID NAME 
---------- -------------------- 
     1 joe 

Meine erste Abfrage, select * from t1;, ist identisch mit Ihrer Nicht-Flashback-Abfrage, die alle Zeilen aus der Tabelle auswählt.

Und meine zweite Abfrage, select * from t1 as of timestamp to_timestamp('02-MAY-17 11:00','DD-MON-RR HH24:MI'); ähnelt Ihrer Flashback-Abfrage, die nur eine Zeile auswählt.

Natürlich ist das Einfügen einer Zeile schneller als das Einfügen von drei Zeilen.