2012-08-02 70 views
0

我有一個CREATE TABLE查詢可以使用兩種方法來實現(創造數以千計的select語句/萬條記錄):減去VS刪除不存在於甲骨文

第一種方法:

create table as select some data minus (select data from other table) 

OR

第一我應該創建該表作爲

create table as select ..... 

然後

delete from ..where exist. 

我想第二種方法更好。對於哪種查詢,成本更低?爲什麼減法查詢不如第二種方法快? 編輯: 我忘了提及create語句也加入了兩個表。

+2

第一個比較好。它將產生更少的REDO和UNDO。 – 2012-08-02 14:17:49

+0

第一種方法更好,因爲您只創建所需的記錄。 – Ollie 2012-08-02 14:19:40

+0

但我已檢查,第二種方法整體花費的時間較少。 – subodh1989 2012-08-02 14:20:32

回答

4

減號很慢可能是因爲它需要對磁盤上的表進行排序以便比較它們。

嘗試用NOT EXISTS而不是MINUS重寫第一個查詢,它應該更快,並且會生成更少的REDO和UNDO(如a_horse_with_no_name所述)。當然,請確保WHERE子句中涉及的所有字段都已編入索引!

+2

'minus'也會抑制源表中的任何重複項,這可能不是問題,但可能是使用'not exists'替代的另一個原因。 – 2012-08-02 14:25:24

+0

@AlexPoole偉大的一點! – mavroprovato 2012-08-02 14:26:10

1

第二個將大量的記錄寫入磁盤,然後刪除它們。這將在10個案例中的9個取得更長的時間,然後過濾你寫入的內容。

因此,如果第一個實際上不是更快,我們需要更多關於涉及的表和聲明的信息。