如何更新包含5亿条记录的表格?

时间:2016-05-20 16:37:28

标签: sql oracle plsql database-performance

表格ORIGINAL_ADDRESS包含 5亿条记录,并且在CITYSTREETBUILDING上没有任何索引。< / p>

它只有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'

3 个答案:

答案 0 :(得分:0)

尝试使用以下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
但是,如果您能够为表创建新索引,则可以解决您的问题。

答案 1 :(得分:0)

在没有索引的情况下,您最好的希望是对大表和小表进行全面扫描,并在它们之间进行散列连接。成本将略高于两次全表扫描的成本加上更改值的成本。因此,成本通常取决于读取存储带宽。

要改进,你必须添加索引。

通过减少连接所需的内存消耗可能有助于散列分区,但索引将是第一选择,因为小表听起来不够大,不会在这方面造成问题。

如果从头开始,请注意,我会考虑在连接列的组合上添加计算的哈希值,并在大型表上对其进行索引。这可能会使指数保持较小。

答案 2 :(得分:0)

如果你不能更聪明地工作(索引),那就更加努力(并行):

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,足够的资源,合理的配置等,这可以显着提高性能。