2016-10-07 55 views
1

我已搜查,但不能得到這樣的回答(也許錯關鍵字...)Oracle_How插入從低速選擇查詢數據到兩個表

我來這個問題,今天,當我需要創建一個過程以2種不同的模式計算要保存到2個報表的數據。假設這兩個表具有相同的結構。

計算的數據可能需要超過60秒的查詢(數據可能會或可能不會,如果再次運行更改SELECT衆所周知聲明的結果)

我有兩個方式接入數據,這兩個表:

  1. 只需運行插入兩個時間與同一選擇查詢。
  2. 使用GTT全局臨時表保存SELECT查詢中的計算數據,然後使用該GTT中的數據INSERT到這兩個表。

不知甲骨文將保留結果的緩存SELECT查詢,使第一種方式會有更好的表現,然後第二種方式(但具有較長的代碼,並複製代碼,不同步?)。

因此,任何人都可以確認並解釋解決這個問題的正確方法嗎?或者更好的方式來做到這一點?

謝謝

附錄1:

INSERT INTO report_table (col1, col2, ....) 
SELECT ..... 
FROM ..... 
--(long query) 
; 
INSERT INTO center_schema.report_table (col1, col2, ....) 
SELECT ..... 
FROM ..... 
--same select query as above 
; 

和2:

INSERT INTO temp_report_table(col1, col2, ...) 
SELECT ..... 
FROM ..... 
--(long query) 
; 
INSERT INTO report_table (col1, col2, ....) 
SELECT col1, col2, .... 
FROM temp_report_table 
; 
INSERT INTO center_schema.report_table (col1, col2, ....) 
SELECT col1, col2, .... 
FROM temp_report_table 
; 
+0

GTT聽起來像是要走的路。如果作爲同一事務的一部分運行select語句兩次,即使查詢中的數據發生更改,它實際上也應該產生相同的結果。如果您在查詢之間提交,則可以更改。如果你不在乎,GTT將交易內存(暫時)以重新運行查詢的費用 - 對於60秒的查詢,這是一個很好的交易 – Hambone

+0

請注意,句子「_如果你運行select語句兩次作爲同一事務的一部分,它實際上應該產生相同的結果_「是不正確的。 – nop77svk

回答

1

不,你還有第三種選擇 - 精彩多INSERT ...

INSERT ALL 
    INTO report_table (col1, col2, ....) 
     VALUES (X.col1, X.col2, ...) 
    INTO center_schema.report_table (col1, col2, ...) 
     VALUES (X.col1, X.col2, ...) 
SELECT col1, col2, ... 
FROM your_table X 
--(long query) 
; 

欲瞭解詳細內容對於一次加載多個表的好方法,請參閱Oracle documentation的相應部分。

+0

感謝您使用這種多插入解決方案! –