繁体   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