2016-11-09 49 views
1

我有5800万条记录,其中有30列,其中我希望通过与另一个具有两列四千五百万记录的表进行映射来更新一列。更新查询两个巨大的表之间的单个列

MERGE INTO /*+ PARALLEL(tbl_temp) */ tbl_temp tcm 
USING (SELECT frn.id, frn.risk FROM temp_new frn) a 
ON (a.id = tcm.fi_id) WHEN MATCHED THEN UPDATE 
SET tcm.risk_label=a.risk; 

上面是查询,我已经尝试过,但它需要超过12小时。我已经尝试批量更新也与批量大小10000但同样的问题。是否有任何其他方式来提高查询的性能

+1

提示追随第一个关键字('merge','insert','select'等)。 –

+1

通常,当你使用'MERGE'而只有'WHEN MATCHED THEN UPDATE'子句时,那么一个简单的'UPDATE'就足够了。你有'ID'和'FI_ID'上的索引吗?表TBL_TEMP是否已分区?如果不是,那么PARALLEL提示没有多大意义。 –

+0

@WernfriedDomscheit,是的,我们在指定的列上有索引,并且表没有分区。 – TSKSwamy

回答

2

如果您有足够的可用空间使用重新创建您的表 - 创建具有临时名称和相同结构的新表,使用插入作为从当前表中选择左加入映射表,使用并行和附加提示。重命名当前表,将新表重命名为实际名称。将旧表中的所有索引/同义词,授予/触发器等移至新的索引。测试你的应用。如果没关系,那么你可以放弃旧的。

+0

当新表格按需要时可能会清空并重新填充旧表格,从而节省必须为外围对象执行一些DDL –

+0

如果迁移需要几个小时,怀疑这是个好主意。重新申请ddls更容易。还有另外一种方法 - 创建一个新的表格,使用1分区(例如系统)进行分区,然后使用交换分区将数据移回旧表格。 – Rusty