Oracle Insert使用FLASHBACK查询

时间:2017-05-01 18:42:00

标签: sql oracle performance flashback

我在通过Database Link连接的不同数据库上有两个相同的模式。

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

以快速速率插入Schema_1(源架构)的行。

我在Source Schema中运行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 个答案:

答案 0 :(得分: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');类似于您的闪回查询,它只选择一行。

当然,插入一行比插入三行要快。