表格ORIGINAL_ADDRESS
包含 5亿条记录,并且在CITY
,STREET
或BUILDING
上没有任何索引。< / p>
它只有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'
答案 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,足够的资源,合理的配置等,这可以显着提高性能。