2015-02-24 144 views
0

我正在嘗試使用以下查詢在Oracle 11g中運行更新語句。通常它工作得很好。這一次,這一陳述花費了很長的時間。我在之前的每張表格中都運行了1.5億行。這一次我在兩張表中都有1.89億行,這真的很掙扎。我試過創建索引來幫助更快的運行。 Recid是唯一的,每個表格都是一樣的。更新查詢效率

UPDATE QP24784_tab1_Strip1 A SET NoConflict_600_Flg = 1 
WHERE NOT EXISTS (
    SELECT 1 FROM QP24784_tab1_Strip_NC1 B 
    WHERE A.zip = B.zip AND A.lname = B.lname AND A.fname = B.fname 
    AND noconflict_600_rn > 1); 

表QP24784_tab1_Strip_NC1是從QP24784_tab1_Strip1列的子集,但在創建nonconflict_600_rn標誌。這個過程的目的是創建一個與其他記錄沒有衝突的標誌 - 沒有衝突意味着沒有其他記錄具有相同的名稱和郵政編碼。使用row_number函數在行上創建noconflict_600_rn,並且row_number大於1的任何記錄意味着存在衝突。然後,我通過加入名稱和zip將該標誌添加回主表。

對於我的生活,我似乎無法想出一種更有效的方法。任何建議表示讚賞。

+0

Recid是獨一無二的嗎?但是你不會在你的查詢中使用它。也發佈執行計劃。根據定義,反連接是有問題的,有時候如何優化它們是沒有辦法的。您可以在QP24784_tab1_Strip_NC1(zip,lname,fname,noconflict_600_rn)上創建唯一/名詞索引。但是,即使您創建該索引,Oracle可能會決定將整個表QP24784_tab1_Strip_NC1放入TEMP表空間的散列段中,然後通過QP24784_tab1_Strip1運行全表掃描。 – ibre5041 2015-02-24 15:47:38

+0

另外當你注意到你對數據有更多的瞭解時,你可以使用基數提示來幫助他。 – ibre5041 2015-02-24 15:48:52

+0

我認爲所有這些解釋計劃不會幫助你處理的行數。您需要批量運行更新,例如針對行數運行更新並提交。然後再次運行你的代碼......如果我正確地記住了這個技巧,在Tom Kyte有效的Oracle設計書中描述。在其中一章中,他描述瞭如何處理大量行並確保有效運行查詢的確切步驟。如果不忘記的話,我可以試着查看它。我認爲你可以下載這本書。 – Art 2015-02-24 17:02:21

回答

0

您可以嘗試在臨時表中插入想要設置爲1的所有ID,然後從該表中更新。 Oracle傾向於喜歡這種方式。

在一天結束時,我在更新Oracle數百萬條記錄時不得不做出可怕的基於遊標的更新。