[英]How to update a table that contains 500 million records?
表ORIGINAL_ADDRESS
包含5億條記錄,並且在CITY
, STREET
或BUILDING
上沒有任何索引。
它只有address_id
索引。
表EXTERNAL_ADDR
包含6000條記錄,並且沒有CITY
, STREET
和BUILDING
的索引。 我們為此次更新創建了它。 我們可以做任何事情。
如何進行下一次更新? 快速!
MERGE INTO ORIGINAL_ADDRESS
USING EXTERNAL_ADDR ON (ORIGINAL_ADDRESS.CITY = EXTERNAL_ADDR.CITY
AND ORIGINAL_ADDRESS.STREET = EXTERNAL_ADDR.STREET
AND ORIGINAL_ADDRESS.BUILDING = EXTERNAL_ADDR.BUILDING)
WHEN MATCHED THEN UPDATE SET
ORIGINAL_ADDRESS.EXT_ID = EXTERNAL_ADDR.ID
我們可以將更新記錄的數量限制為2200萬加:
where the_field_without_index = 'Y'
嘗試使用以下8個步驟之一:這是一個只有您可以通過代碼執行的反復試驗。
1. Explicit Cursor Loop
2. Implicit Cursor Loop
3. UPDATE with nested SET subquery
4. BULK COLLECT / FORALL UPDATE
5. Updateable Join View
6. MERGE
7. Parallel DML MERGE
8. Parallel PL/SQL
這篇文章最能解釋這個! http://www.orafaq.com/node/2450
但是,如果您能夠為表創建新索引,則可以解決您的問題。
在沒有索引的情況下,您最好的希望是對大表和小表進行全面掃描,並在它們之間進行散列連接。 成本將略高於兩次全表掃描的成本加上更改值的成本。 因此,成本通常由讀取存儲帶寬決定。
要改進,你必須添加索引。
通過減少連接所需的內存消耗可能有助於散列分區,但索引將是首選,因為小表聽起來不夠大,不會在這方面造成問題。
如果從頭開始,請注意,我會考慮在連接列的組合上添加計算的哈希值,並在大型表上建立索引。 它可能會使指數保持較小。
如果你不能更聰明地工作(索引),那就更加努力(並行):
alter session enable parallel dml;
MERGE /*+ parallel */ INTO ORIGINAL_ADDRESS
USING EXTERNAL_ADDR ON (ORIGINAL_ADDRESS.CITY = EXTERNAL_ADDR.CITY
AND ORIGINAL_ADDRESS.STREET = EXTERNAL_ADDR.STREET
AND ORIGINAL_ADDRESS.BUILDING = EXTERNAL_ADDR.BUILDING)
WHEN MATCHED THEN UPDATE SET
ORIGINAL_ADDRESS.EXT_ID = EXTERNAL_ADDR.ID
假設您擁有Enterprise Edition,足夠的資源,合理的配置等,這可以顯着提高性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.