2014-10-06 64 views
1

我有一個非常簡單的SQL語句,它在Oracle 10g數據庫上執行。它的一些數據移動從一個模式到另一個:Oracle聲明掛起

CREATE TABLE TARGET.BIG_TABLE AS SELECT * FROM SOURCE.BIG_TABLE 
WHERE (COLUMN1, COLUMN2) IN (SELECT COLUMN1, COLUMN2 FROM TARGET.HELP_TABLE); 

有一個在TARGET.HELP_TABLE爲COLUMN1和COLUMN2的唯一約束。在SOURCE.BIG_TABLE中只有一個組合的主鍵(COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5)。

該語句本身沒有問題,因爲它已經在類似的測試環境中進行了多次測試。

但是,在真實環境下,該聲明在大約3小時後沒有任何I/O活動。 8小時後,我們中止了執行。

這種行爲的原因是什麼?我能做些什麼來解決問題的根源?我絕對沒有線索!

+0

它是否被未提交的事務鎖定? – 2014-10-06 08:07:19

+0

理論上,這是不可能的。在執行語句之前,所有將事務寫入源模式的進程都將關閉。但是,是否有可能知道爲什麼聲明掛起或爲何等待? – user3783827 2014-10-06 08:16:35

+3

查詢可能需要很長時間。您是否在生產環境中檢查了'EXPLAIN PLAN' [您的選擇查詢的結果](http://www.orafaq.com/wiki/Explain_Plan) – 2014-10-06 08:26:12

回答

1

嘗試擺脫解釋計劃中的嵌套循環。考慮使用內部改寫查詢加盟:

SELECT /*+ use_hash(a b) */ 
     a.* 
    FROM SOURCE.BIG_TABLE a 
inner join (SELECT distinct COLUMN1, COLUMN2 FROM TARGET.HELP_TABLE) b 
    on b.COLUMN1 = a.COLUMN1 
    and b.COLUMN2 = a.COLUMN2; 

也可以考慮使用use_hash提示。選擇所有行時不應使用索引(除非help_table中的column1和column2可能通過索引快速完整掃描返回)。僅當存在重複時,纔在內部查詢中使用distinct

考慮添加parallel提示。