2017-05-01 70 views
0

我有兩個相同的模式,在通過數據庫鏈接連接的不同數據庫上。Oracle插入使用FLASHBACK查詢

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

將行快速插入到Schema_1(源模式)中。

我運行在源模式的SQL如下:

Insert into [email protected]_LINK select * from Table_1 

這種說法需要幾分鐘的時間。

現在我改變聲明如下(使用閃回查詢)

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

該查詢在幾秒鐘內完成。

爲什麼這麼大的差異?

+0

您是否檢查查詢返回多少條記錄:'select * from Table_1'和'select * Table_1 as timestamp to_timestamp(to_timestamp(date));'? – kpater87

+0

這些有很多不同。閃回查詢是最簡單的。它將查看閃回數據以從本地數據庫返回數據。但是,通過鏈接插入將不得不(1)通過全表掃描讀取表中的所有數據(2)通過某個未指定的網絡將數據傳輸到某個遠程系統(3)通過適當的事務將數據寫入遠程表控制/日誌記錄/重做/等等。對我來說,閃回查詢速度更快是不言而喻的。 – unleashed

+1

數據庫鏈接如何影響性能差異?另外,是否真的是'to_timestamp(to_timestamp('?這對我來說看起來是錯誤的... –

回答

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');與您的閃回查詢類似,後者只選擇一行。

當然插入一行比插入三行要快。