2016-11-09 77 views
1

我有5800萬條記錄,其中有30列,其中我希望通過與另一個具有兩列四千五百萬記錄的表進行映射來更新一列。更新查詢兩個巨大的表之間的單個列

MERGE INTO /*+ PARALLEL(tbl_temp) */ tbl_temp tcm 
USING (SELECT frn.id, frn.risk FROM temp_new frn) a 
ON (a.id = tcm.fi_id) WHEN MATCHED THEN UPDATE 
SET tcm.risk_label=a.risk; 

上面是查詢,我已經嘗試過,但它需要超過12小時。我已經嘗試批量更新也與批量大小10000但同樣的問題。是否有任何其他方式來提高查詢的性能

+1

提示追隨第一個關鍵字('merge','insert','select'等)。 –

+1

通常,當你使用'MERGE'而只有'WHEN MATCHED THEN UPDATE'子句時,那麼一個簡單的'UPDATE'就足夠了。你有'ID'和'FI_ID'上的索引嗎?表TBL_TEMP是否已分區?如果不是,那麼PARALLEL提示沒有多大意義。 –

+0

@WernfriedDomscheit,是的,我們在指定的列上有索引,並且表沒有分區。 – TSKSwamy

回答

2

如果您有足夠的可用空間使用重新創建您的表 - 創建具有臨時名稱和相同結構的新表,使用插入作爲從當前表中選擇左加入映射表,使用並行和附加提示。重命名當前表,將新表重命名爲實際名稱。將舊錶中的所有索引/同義詞,授予/觸發器等移至新的索引。測試你的應用。如果沒關係,那麼你可以放棄舊的。

+0

當新表格按需要時可能會清空並重新填充舊錶格,從而節省必須爲外圍對象執行一些DDL –

+0

如果遷移需要幾個小時,懷疑這是個好主意。重新申請ddls更容易。還有另外一種方法 - 創建一個新的表格,使用1分區(例如系統)進行分區,然後使用交換分區將數據移回舊錶格。 – Rusty