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 ));

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

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


person oradbanj    schedule 01.05.2017    source источник
comment
Вы проверяли, сколько записей возвращают запросы: select * from Table_1 и select * Table_1 as of timestamp to_timestamp ( to_timestamp ( date ));?   -  person kpater87    schedule 01.05.2017
comment
С этими много разного. Запрос флэшбэка самый простой. Он будет просматривать данные воспоминаний, чтобы возвращать данные из локальной базы данных. Но вставка по ссылке должна будет (1) прочитать все данные из таблицы с помощью полного сканирования таблицы (2) передать данные в какую-то удаленную систему по какой-то неопределенной сети (3) записать в удаленную таблицу с соответствующей транзакцией управление / регистрация / повтор / и т. д. Для меня не составляет труда то, что запрос воспоминаний выполняется быстрее.   -  person unleashed    schedule 01.05.2017
comment
Как ссылка db влияет на разницу в производительности здесь? Кроме того, это действительно to_timestamp(to_timestamp(? Мне это кажется неправильным...   -  person William Robertson    schedule 01.05.2017
comment
@ kpater87: количество записей не должно иметь значения.   -  person oradbanj    schedule 01.05.2017
comment
@unleashed: оба запроса извлекают данные из локальной базы данных и вставляют их в удаленную базу данных. Единственное отличие состоит в том, что второй извлекается с использованием синтаксиса AS OF.. для использования запроса Oracle Flashback.   -  person oradbanj    schedule 01.05.2017
comment
@oradbanj Пропустил это, извините. Затем я перехожу к объему. Сколько строк возвращает каждый запрос? Это имеет значение.   -  person unleashed    schedule 01.05.2017
comment
@WilliamRobertson: оба запроса используют DBLINK. Синтаксис сокращен, но является правильным (выберите * из TABLE с отметкой времени to_timestamp ('01.05.2017 10:00:00','mm/dd/yyyy hh24:mi:ss')   -  person oradbanj    schedule 01.05.2017
comment
@WilliamRobertson Oracle реализует это с помощью неявного вызова TO_CHAR, подобного этому TO_TIMESTAMP( TO_CHAR( TO_TIMESTAMP( date ), NLS_TIMESTAMP_FORMAT ), NLS_TIMESTAMP_FORMAT ), поэтому, хотя второй TO_TIMESTAMP не нужен, он не должен прерывать запрос.   -  person MT0    schedule 01.05.2017
comment
действительно количество записей не должно иметь значения? Ну вот и двадцать с лишним лет практики настройки производительности.   -  person APC    schedule 02.05.2017
comment
Количество записей будет иметь значение, если между этим моментом и указанной датой из второго запроса была массовая вставка.   -  person kpater87    schedule 02.05.2017
comment
@oradbanj, я вижу, что оба запроса используют ссылку на базу данных. Я спросил, какое это имеет отношение к вопросу. Также преобразование даты в метку времени в строку в метку времени, вероятно, просто отлично. Удачи.   -  person William Robertson    schedule 02.05.2017
comment
@APC - я имел в виду, что оба запроса эквивалентны, оба вставляют данные по ссылке на базу данных. Объем данных, получаемых обоими запросами, будет примерно одинаковым (но не совсем одинаковым, поскольку записи вставляются в источник с высокой скоростью). Единственное отличие состоит в том, что второй запрос пытается создать непротиворечивый образ данных с помощью FLASHBACK. Поэтому я склоняюсь к тому, чтобы выяснить, замедляет ли процесс ИСПОЛЬЗОВАНИЕ FLASHBACK.   -  person oradbanj    schedule 02.05.2017


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

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

person atokpas    schedule 02.05.2017