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');
похож на ваш запрос флэшбека, который выбирает только одну строку.
Конечно, вставка одной строки быстрее, чем вставка трех строк.