簡體   English   中英

如何更新包含5億條記錄的表格?

[英]How to update a table that contains 500 million records?

ORIGINAL_ADDRESS包含5億條記錄,並且在CITYSTREETBUILDING上沒有任何索引。

它只有address_id索引。

EXTERNAL_ADDR包含6000條記錄,並且沒有CITYSTREETBUILDING的索引。 我們為此次更新創建了它。 我們可以做任何事情。

如何進行下一次更新? 快速!

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM