Oracle Insert с использованием FLASHBACK Query

У меня есть две идентичные схемы в разных базах данных, связанных через Database Link.

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

Строки вставляются в Schema_1 (исходная схема) с высокой скоростью.

Я запускаю SQL в схеме источника следующим образом:

Insert into Table_1@DB_LINK select * from Table_1

Это утверждение занимает несколько минут.

Теперь я изменяю утверждение следующим образом (используя ретроспективный запрос)

Insert into Table_1@DB_LINK select * Table_1 as of timestamp to_timestamp ( to_timestamp ( date ));

Этот запрос завершается за несколько секунд.

Почему такая огромная разница?

1 ответ

В вашем ретроспективном запросе вы выбираете строки, которые были вставлены именно на 05/01/2017 10:00:00, Но в вашем запросе без флешбека вы выбираете все строки, вставленные в таблицу.

Простая демонстрация:

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

Мой первый запрос, select * from t1;, идентичен вашему запросу без флешбека, который выбирает все строки из таблицы.

И мой второй запрос, select * from t1 as of timestamp to_timestamp('02-MAY-17 11:00','DD-MON-RR HH24:MI'); похож на ваш запрос флэшбека, который выбирает только одну строку.

Конечно, вставка одной строки быстрее, чем вставка трех строк.

Другие вопросы по тегам